1

画像を非同期でダウンロードするためのオープンソース(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];
}

NSOperationのMKOperation.mサブクラス。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

メソッドでは、適切なinitメソッドを呼び出すことはなく、start次のように呼び出します。

MKAsyncImageDownloader *downloader = [[MKAsyncImageDownloader alloc] init];

あなたは電話する必要があります

MKAsyncImageDownloader *downloader = [[MKAsyncImageDownloader alloc] initWithDelegate:myDelegate];

loader次に、オブジェクトを別の場所に設定したと言いますか?これらは2つの別個のオブジェクトであり、実際に使用しているように見えるのは上記で参照されているものです。

あれは:

loader = [[MKAsyncImageDownloader alloc] initWithDelegate:self];

しません

MKAsyncImageDownloader *downloader = [[MKAsyncImageDownloader alloc] init];

仕事。MKOperationにloaderは、デリゲートが設定されているクラスへの参照がありません。

あなたは次のように述べています。

NSOperationのMKOperation.mサブクラス。MKAsynImageDownloaderを割り当て/初期化して、セレクターのみを実行します。

ここで何をしているのか誤解していると思います。RootControllerに存在するインスタンスではなく、そのインスタンスの新しいインスタンスを作成し、そのMKAsynImageDownloaderインスタンスでセレクターを実行します。おそらく、初期化中にオブジェクトを取得する必要があります。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 に答える
1

SDWebImageを調べましたか?

問題を解決する最も簡単な方法は、維持する必要のない作業コードを使用することです...

https://github.com/rs/SDWebImage

于 2011-04-26T02:13:43.053 に答える