2017-01-20 5 views
0

画像ダウンロード、キャッシュ用のカテゴリ(UIImageView + SDWebcache.m)を提供するSDWebImageライブラリを提供しており、UITableViewまたはUIColllectionViewセル。私はライブラリを使いたくないし、同様のカテゴリを作りたいと思っています。イメージがダウンロードされたら、このイメージが属するセルを追跡し、セルが再表示された別のindexPathにイメージを設定しないようにセルが表示されているかどうかを確認します。私が書いたコード(キャッシング・ロジックがここに削除されます):ライブラリを使用せずにカテゴリを使用して、画像をダウンロードしてTableViewセルを非同期で更新します。

// Inside the category, I have this method 
-(void)SetThumbImageFordownloadURL:(NSString*)url { 

    [MyDownloadManager asyncImageDownload:url withProgressHandler:nil andCompletionHandler:^(UIImage *image, NSUInteger errorCode){ 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      //if cell is not visible and is reused by another index, this image wil be set on wrong cell 
      [self setImage:image]; 
     }); 

    }]; 

} 

答えて

0

オプション1:再利用方法に出し性として、細胞内のURLへの参照を保持し、それはnil。

し、あなたのコードブロックで、画像の実際のURLを返し、このような何か:

[MyDownloadManager asyncImageDownload:url withProgressHandler:nil andCompletionHandler:^(UIImage *image, NSURL *url, NSUInteger errorCode){ 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      //check if current hold key is equal to url and only then set the image. 



      [self setImage:image]; 
     }); 
    }]; 

オプション2 /微調整:あなたの「MyDownloadManager」へのキャンセル方法を追加し、電流をキャンセルしますあなたのtableview/collectionviewの "didEndDisplay"メソッドでダウンロードしてください。

+0

@Sneakw Wiithこの方法には問題があります。 TableViewまたはコレクションビューには、一度に複数のセルが表示されます。したがって、URL1のイメージがダウンロードされると、一度に10個のイメージがコレクションビューで表示されると仮定して、URL 10イメージのダウンロードを開始できました。したがって、downloadImage URLはカテゴリメソッドで提供されたURLと一致せず、画像が表示されてもセルに設定されません。 –

+0

@DeepAroraデータソースメソッドwillDisplayまたはcellForRowの中でブロックを実行すると、ブロックが正しいセルを実行しますが、メソッドの外でこれを実行すると、画像を受け取るたびに可視セルがループする必要があります。 –

関連する問題