使用SDWebImageManager在UICollectionView中加载图像

时间:2014-02-03 16:15:13

标签: ios objective-c lazy-loading uicollectionview sdwebimage

在我的方法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)。如果我再次向下滚动问题仍然是已经显示的单元格,只有新的已加载图像。 知道我做错了吗?

2 个答案:

答案 0 :(得分:1)

为什么不尝试这个 [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

参考SDWebImage

答案 1 :(得分:1)

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

你提出的其他几点;

  1. 在您的代码中,您应该在主线程上设置coverImage.image,而不是在后台。

  2. 最好检查Cell是否可见,或者显示内容没什么意义。

  3. 最好在访问单元格时创建对Collection视图的弱引用以避免循环引用

  4. 所以你的代码)可能会按照你的方式坚持按照以下方式编写(使用类别是最好和最简单的方法)

      __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;
            };
         });  
    
     }];