【IOS】sd_webimageダウンロードネットワーク画像cell展示不全を解決する3つの方法.


UIcollectionまたはUItableViewのcellをロードするときにsd_を使用します.Webimageは画像をロードします.たとえば、次のようにします.
ColCardCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellid" forIndexPath:indexPath];
        cell.backgroundColor = [UIColor lightGrayColor];
 ColModelItem *item1 = [[ColModelItem alloc]init];
item1 setTitle:((ThemeList *)dataArr[indexPath.section-1]).name];
        NSString *url = [NSString stringWithString:((ThemeList *)dataArr[indexPath.section-1]).themepic_url];
        url = [url stringByReplacingOccurrencesOfString:@"\r
" withString:@""]; // url [temp sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:nil options:SDWebImageRetryFailed]; [item1 setImg:temp]; [cell setItem:item1]; // item cell return cell;

viewのcellの画像は1枚目か最後の写真しか表示されず、他の画像はスライドしてリフレッシュしたり、再読み込みを終了したりして正常に表示されないという問題が発生します.
この問題の原因は、インタフェースが複数のcellのダウンロード要求を一度に要求すると、このAPIの要求がキャンセルされる前にピクチャダウンロード要求タスクが発生し、最初のcellを除いてcellに渡されたのはビットマップだけで、残りのcellは再要求をリフレッシュしてピクチャを正常に表示する必要があるためである.
解決方法は親測に3種類ある.
一.completedBlockを使用して、画像のロードが完了したらcellに値を割り当てます.
[tempView sd_setImageWithURL:[NSURL URLWithString:str] placeholderImage:nil options:SDWebImageRetryFailed completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

dispatch_async(dispatch_get_main_queue(), ^{

cell.img = tempView.image;

});

}];


ただし,tempViewは関数内で定義された局所変数であれば,それ自体はオブジェクトを持たず,Blockに入る前に解放されるのでcellに値を付けることはできない.
解決策はtempViewを強参照のグローバル変数として宣言することもできるし、[self.imgViewArr addObject:tempView]でtempViewを強参照してポインタを付与することでcompletedBlockを有効にすることもできる.注意uiのリフレッシュはメインスレッドで行われます.
二.cellのsetメソッドをカスタマイズする
2つ目の方法はsd_Webimageのダウンロード方法はcellのset方法に移行する、すなわちcellをロードする際に、画像のurlのみをパラメータとして正常にcellに伝達し、sdwebimageのurl解析とダウンロードデータの作業をcellに置く.mファイルで完了すると、cellごとにデータロード作業を単独で完了してリクエストタスクを1回だけ送信し、sdwebimageが正常に動作し、すべてのcellも正常に表示されます.
次のようになります.
@implementation Cell{
    UIImageView *_imageView;
}

-(void)setImage:(Nsstring *)iamgeurl {
 
        NSString * url = imageurl;
        url = [url stringByReplacingOccurrencesOfString:@"\r
" withString:@""]; [_imageView sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@" "] options:SDWebImageAllowInvalidSSLCertificates]; }

 
三.downloadImageWithURLメソッドを使用してデータダウンロードを行います.
前にsd_についてお話ししますsetImageWithURLは余分なリクエストタスクをキャンセルし、downloadImageWithURLメソッドは以前に発生したリクエストタスクをキャンセルしません.
downloadImageWithURLでcompletedBlockを正常にコールバックし、私たちの画像を表示するように要求します.
しかし、この方法を使うのも2つの弊害があります.1つはdownloadImageWithURLが単純なダウンロード操作しかできないことです.キャッシュメカニズムはありません.画像をキャッシュする必要がある場合は、自分でキャッシュ方法を書く必要があります.2つ目は、大量のcellがロードされている場合、私たちは一度に大量のダウンロード要求を出します.実際には、一時的にロードする必要がないものが多く、ダウンロードリクエストの手動管理にも関連しています.皆さんは自分で実験することができます.
 
各位の见官に感谢して、足りないところがあってご指摘ください、もっと良い方法があっても多く交流することができます.