Метод делегата не вызывается
Я делаю вспомогательный класс OpenSource (github) для асинхронной загрузки изображений (у меня были большие проблемы).
Однако у меня есть методы делегата, настроенные для оповещения делегата о том, что изображение закончило загрузку. Проблема в том, что метод делегата не вызывается. Я устанавливаю делегата и все, но я не имею понятия, почему проблема возникает.
Пожалуйста, посмотрите на мой код! Я только опубликовал соответствующий код.
MKAsyncImageDownloader.h
@protocol MKAsyncImageDownloaderDelegate <NSObject>
@required
- (void)imageShouldFinishDownloading;
@end
@interface MKAsyncImageDownloader : NSObject {
id <MKAsyncImageDownloaderDelegate> delegate;
}
- (id) initWithDelegate:(id <MKAsyncImageDownloaderDelegate>) delegat;
@property (retain, nonatomic) id <MKAsyncImageDownloaderDelegate> delegate;
@end
MKAsyncImageDownloader.m
- (id) initWithDelegate:(id<MKAsyncImageDownloaderDelegate>) delegat {
self = [super init];
if (self) {
delegate = delegat;
}
return self;
}
- (void)imageAtURLHasDownloaded:(NSDictionary *)dict {
[downloadedImageArray addObject:[dict objectForKey:@"image"]];
[[self delegate] imageShouldFinishDownloading];
}
MKOperation.m Подкласс NSOperation. Я выделяю / инициализирую MKAsynImageDownloader для выполнения только селектора. Код:
- (void)start {
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:self.targetURL]];
if (image) {
NSDictionary *dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:image, self.targetURL, nil] forKeys:[NSArray arrayWithObjects:@"image", @"url", nil]];
MKAsyncImageDownloader *downloader = [[MKAsyncImageDownloader alloc] init];
[downloader performSelectorOnMainThread:@selector(imageAtURLHasDownloaded:) withObject:dict waitUntilDone:YES];
[dict release];
[downloader release];
}
[image release];
}
RootViewController.h
MKAsyncImageDownloader *loader;
RootViewController.m Просто чтобы показать, как я настраиваю делегата.
loader = [[MKAsyncImageDownloader alloc] initWithDelegate:self];
2 ответа
В вашем start
метод, который вы никогда не вызываете свой правильный метод инициализации, вы вызываете:
MKAsyncImageDownloader *downloader = [[MKAsyncImageDownloader alloc] init];
ты должен звонить
MKAsyncImageDownloader *downloader = [[MKAsyncImageDownloader alloc] initWithDelegate:myDelegate];
Тогда вы говорите, что установили loader
возражать где-то еще? Это два отдельных объекта, на которые вы, кажется, на самом деле используете, и на которые ссылаются выше.
То есть:
loader = [[MKAsyncImageDownloader alloc] initWithDelegate:self];
не делает
MKAsyncImageDownloader *downloader = [[MKAsyncImageDownloader alloc] init];
Работа. Ваша MKOperation не имеет отношения к вашей loader
класс с установленным делегатом.
Вы заявляете:
MKOperation.m Подкласс NSOperation. Я выделяю / инициализирую MKAsynImageDownloader для выполнения только селектора.
Я думаю, вы неправильно понимаете, что вы здесь делаете. Вы создаете новый экземпляр MKAsynImageDownloader
и выполнение селектора в этом случае, а не loader
экземпляр, который живет в вашем RootController. Вы, вероятно, хотите иметь MKOperation
взять MKAsyncImageDownloader
объект во время его иници.
РЕДАКТИРОВАТЬ:
Это тот "загрузчик", о котором я говорю. В начале вашей MKOperation
if (image) {
NSDictionary *dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:image, self.targetURL, nil] forKeys:[NSArray arrayWithObjects:@"image", @"url", nil]];
-->> MKAsyncImageDownloader *downloader = [[MKAsyncImageDownloader alloc] init];
[downloader performSelectorOnMainThread:@selector(imageAtURLHasDownloaded:) withObject:dict waitUntilDone:YES];
[dict release];
[downloader release];
}
Это отдельный экземпляр от того, который живет в вашем RootViewController, у этого нет установленного делегата. Это тот, над которым вы работаете, поэтому он пытается уведомить делегата... но, опять же, у него нет набора делегатов.
Вы смотрели в SDWebImage?
Иногда самый простой способ решить проблему - использовать рабочий код, который вам не нужно поддерживать...