1

我正在制作一个用于异步下载图像的 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 的子类。我 alloc/init 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];
4

2 回答 2

1

你看过 SDWebImage 吗?

有时解决问题的最简单方法是使用您不必维护的工作代码......

https://github.com/rs/SDWebImage

于 2011-04-26T02:13:43.053 回答
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 的子类。我 alloc/init MKAsynImageDownloader 只执行选择器。

我想你误解了你在这里做什么。您将创建一个全新的实例并在MKAsynImageDownloader实例上执行选择器,而不是位于您的 RootController 中的实例。您可能希望在它初始化期间获取一个对象。loaderMKOperationMKAsyncImageDownloader

编辑:

这就是我所指的“下载器”。在您的 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 中的实例不同的实例,这个实例没有委托集。这是您正在处理的那个,因此,这个是试图通知代表的那个……但同样,它没有代表集。

于 2011-04-26T01:13:39.990 回答