У меня есть класс PictureDownloader для асинхронной загрузки изображений с сервера. Он назначает себя делегатом NSURLConnection и, как таковой, сохраняется NSURLConnection. Я создаю несколько таких PictureDownloader в DetailViewController для получения соответствующих изображений, поэтому DetailViewController является делегатом каждого PictureDownloader. Когда пользователь покидает DetailViewController, все оставшиеся загрузки отменяются, однако иногда кажется, что PictureDownloader завершил загрузку изображения (вызывается connectionDidFinishedLoading) до того, как соединение было отменено, но DetailViewController больше не существует (но PictureDownloader делает, потому что он сохраняется NSURLConnection), поэтому вызов
[self.delegate didLoadPictureWithID:self.ID];
внутри PictureDownloader выдаст EXC_BAD_ACCESS или иногда «неопознанный селектор, отправленный экземпляру».
Вот соответствующие части исходного кода:
создание PictureDownloader внутри DetailViewController
- (void)startPictureDownload:(Picture *)pic withPictureId:(NSString *)pId forID:(int)ID
{
PictureDownloader *downloader = [self.downloadsInProgress objectForKey:[NSNumber numberWithInt:ID]];
if(!downloader)
{
downloader = [[PictureDownloader alloc] init];
downloader.picture = pic;
downloader.pictureId = pId;
downloader.ID = ID;
downloader.delegate = self;
[self.downloadsInProgress setObject:downloader forKey:[NSNumber numberWithInt:ID]];
[downloader startDownload];
[downloader release];
}
}
отмена загрузок (вызывается, когда DetailViewController возвращается к обзору)
- (void)cancelAllDownloads
{
[self.downloadsInProgress enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
[obj cancelDownload];
}];
}
метод делегата, который вызывается после завершения загрузки PictureDownloader
- (void)didLoadPictureWithID:(int)dID;
{
PictureDownloader *downloader = [self.downloadsInProgress objectForKey:[NSNumber numberWithInt:dID]];
if(downloader)
{
UIImageView *imageView = (UIImageView *)[self.view viewWithTag:dID];
imageView.image = [UIImage imageWithData:downloader.imageData];
[self.downloadsInProgress removeObjectForKey:[NSNumber numberWithInt:dID]];
}
}
cancelDownload внутри PictureDownloader
- (void)cancelDownload
{
[self.imageConnection cancel];
self.imageConnection = nil;
self.imageData = nil;
}
connectionDidFinishedЗагрузка внутри PictureDownloader
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if(self.picture)
{
self.picture.data = self.imageData;
NSError *error = nil;
[self.picture.managedObjectContext save:&error];
}
if(self.delegate != nil && [self.delegate respondsToSelector:@selector(didLoadPictureWithID:)] ) //place of failure
[self.delegate didLoadPictureWithID:self.ID];
self.imageData = nil;
self.imageConnection = nil;
}
Может кто-нибудь подскажет, как я могу решить эту проблему?
Помощь очень ценится.