在我的方法cellForItemAtIndexPath中,我有以下代码:

SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadWithURL:[NSURL URLWithString:coverURL] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {

} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) {
    RRRBigItemCell *cell = (RRRBigItemCell *)[collectionView cellForItemAtIndexPath:indexPath];
    if (cell) {
        RRRImageView *coverView = (RRRImageView *)[cell viewWithTag:COVER_TAG];
        coverView.image = image;
    }
}];

当我启动应用程序并向下滚动时,一切正常。但是当我向上滚动而不是已显示的单元格尚未加载图像时(单元格== nil)。如果我再次向下滚动,则已经显示的单元格仍然存在问题,只有新单元格才加载图像。
知道我在做什么错吗?

最佳答案

@pawan是正确的,这将是实现SDWebImage的最简单方法。它基本上是UIImage的类别,因此只需使用类别方法(setImageWithURL)。

自您提出问题以来,还有其他几点;

  • 在代码中,应该在主线程上而不是在后台设置coverImage.image。
  • 最好检查一下Cell是否可见,或者显示内容没有什么意义。
  • 好的做法是在访问单元格时为Collection视图创建一个弱引用以避免循环引用

  • 因此,如果您坚持按照自己的方式进行操作,则代码可能写成如下(使用类别是最好和最简单的方法)
      __weak myCollectionViewController *weakSelf = self;
      SDWebImageManager *manager = [SDWebImageManager sharedManager];
      [manager downloadWithURL:[NSURL URLWithString:coverURL] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
    
      } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) {
    
         dispatch_async(dispatch_get_main_queue(), ^{
            if ([weakSelf.collectionView.indexPathsForVisibleItems containsObject:indexPath]) {
               RRRBigItemCell *cell =  (RRRBigItemCell *)[weakSelf.collectionView cellForItemAtIndexPath:indexPath];
               RRRImageView *coverView = (RRRImageView *)[cell viewWithTag:COVER_TAG];
               coverView.image = image;
            };
         });
    
     }];
    

    10-08 09:14