我正在制作一个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];
答案 0 :(得分:1)
在你的start
方法中,你永远不会调用正确的init方法,而是在调用:
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
的全新实例并在 实例上执行选择器,而不是生成在RootController中的loader
实例。您可能希望{init}期间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中的实例分开的实例,这个实例没有委托集。这是你正在进行的工作,因此,这一个是试图通知代表的那个......但是,不有代表集。
答案 1 :(得分:1)