2017-12-17 18 views
5

この問題は、コードが正常に動作していることを理解するためのものです。 私はSDWebImageを見てきましたが、かなり大きかったので、私が質問しているメカニズムがどのように機能しているのかを特定することはできません。UITableViewでSDWebImageを使用する場合のメカニズムの理解

OK、UIImageViews(各セル内に1つ)のテーブルビューがあり、SDWebImageカテゴリ/エクステンションを呼び出して、Webから画像を読み込み、遅延ロードするとします。

テーブルビューをリロードせずに、新しくダウンロードしたイメージで画面上のセルを更新するメカニズムはありますか?

SDWebImage Extensionを使用しているときに、対応するイメージがダウンロードされた直後に、各セルのimageViewsイメージが現れたことに驚きました。

私はtableViewをリロードしなければならないという印象を受けましたが、代わりに各セルのimageViewは画像が利用可能になったときに '自動的に'更新されました!

これはどのように機能しますか? SDWebImageは各セル/画像ビューへの参照を保持していますか?

答えて

3

SDWebImageは負荷がベンが照会した上でUIImageViewインスタンスにロードされたイメージを挿入します。あなたはここに、あなたの細胞に非関連する画像を避けるために、少しトリッキーである必要はありUITableViewCell

はなぜです:

  1. は、あなたが一番上に最初の項目(firstURL)のURLのための画像を要求した想像します目に見える細胞。
  2. あなたのテーブルを下にスクロールし、次の処理が行われます
    • かつての一番上のセルを再利用して、テーブルの下に表示されます。
    • 最後のセルのURLlastURL)に対してイメージが照会されます。
  3. firstURLローディングが完了し、そしてそれはfirstURLローディングが照会された画像のビューであったため、対応する画像を、最後のセルの画像ビュー内に挿入されます。
  4. lastURL読み込みが完了し、対応するイメージが最後のセルのイメージビューに挿入されます。

手順3と4は、画像ビューで速く点滅しているように見える場合があります。

これを避けるには、UITableViewCellサブクラスのprepareForReuseメソッド実装での前回のダウンロードの取り消しに対処する必要があります。

- (void)prepareForReuse { 
    [super prepareForReuse]; 
    [self.imageView sd_cancelCurrentImageLoad]; 
    self.imageView.image = <placeholder image>; 
} 
2

あなたはUITableViewCellのでUIImageviewを参照しているなら、あなたはSDWebImageはUIImageViewクラスの一種ではありませんので、自己が

私は一度お見せしましょうを識別としてビューは、ダウンロードされたイメージのために参照する画像記述する必要かどうかを確認することができます.. このように画像内に画像をリクエストしています。

[cell.imgBrand sd_setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 
    if (error != nil) { 
     NSLog(@"%@", [error localizedDescription]); 
    } 
}]; 

最初の行が実行されると、UIImageView+WebCache.hクラス内のメソッドが呼び出されます。 あなたはそのクラス自身を見ることができるようにUIImageView

@implementation UIImageView (WebCache) 

Class For SDWebCache UIImageView

関連する問題