2013-08-29 20 views
5

私は画像の熱心な負荷束にしようとしています:SDWebImage熱心な負荷画像

for (NSDictionary *s in things) { 
    [manager downloadWithURL:[NSURL URLWithString:s[photo]] 
        options:0 
        progress:nil 
        completed:nil]; 
} 

それは、これらのイメージをダウンロードしていません。しかし、空のコンプリートブロックを渡すと、次のようになります。

for (NSDictionary *s in things) { 
    [manager downloadWithURL:[NSURL URLWithString:s[photo]] 
        options:0 
        progress:nil 
        completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) { }]; 
} 

これはうまく動作します。私の質問は:なぜですか?これを行うより良い方法はありますか?空のブロックを渡すことは、私にとって正しいとは思わない。

答えて

18

使用しているAPIが正しくありません。

イメージをプリフェッチしてキャッシュに格納するには、SDWebImagePrefetcherを使用してください。サイドノートとして

NSMutableArray * urls = [NSMutableArray arrayWithCapacity:things.count]; 
for (NSDictionary *s in things) { 
    [urls addObject:[NSURL URLWithString:s[photo]]]; 
} 
[[SDWebImagePrefetcher sharedImagePrefetcher] prefetchURLs:urls]; 

私はプル要求提出 - ちょうど統合されました - 使用して、あなたが(MIS)されているAPIでcompletedBlockの存在を強制するために、他のプログラマがないように同じ間違いであなたを倒してください。

+0

パーフェクト、ありがとう! – 0xSina

+4

FYI、完了ブロックなしでこれを何度もやっているなら、 'sharedImagePrefetcher'を使いたくないかもしれません。新しいものを実行する前に現在実行中のプリフェッチ操作を取り消すためです。私は自分のコードで共有されたものを使う代わりに新しいものを割り当てます。 –

+0

@EnricoSusatyoそれは巨大です。それをクリアしていただきありがとうございます。 – kevinl

1

あなたは-[SDWebImageManager downloadWithURL:options:progress:completed:] implementationを注意深く見ている場合は、行を見つけることができます:completionBlocknilある場合

if (!url || !completedBlock || (!(options & SDWebImageRetryFailed) && isFailedUrl)) 
{ 
    if (completedBlock) 
    { 
     // Complain about invalid URL, completely irrelevant to us at this point. 
     ... 
    } 
    return operation; 
} 

はそうです、それは何もしません。どうして?おそらく、SDWebImageの開発者は、そのパラメータを渡すことなくメソッドが役に立たないと考えました。 GitHubの問題を作成して尋ねる方がいいでしょう。

+1

それは理にかなっています。画像で何もしていないのであれば、なぜそれを最初に使用していますか?しかし、彼らはこれを強制するためにパラメータアサーションを使うべきです。 –

+1

@ GabrielePetronella私は同意しますが、私はそれを使用する0xSinaの方法は完全に自然です。それは設計上の欠陥です。 – iHunter

+0

開発者に通知するために、例外が発生するはずです。私はプルリクエストをしています。 –

0

SDWebImageは完了ブロックの問題を修正しており、これは現在、スウィフトの1行を持つことも可能である:

SDWebImagePrefetcher.shared().prefetchURLs(urlArray) 
関連する問題