了解在UITableView中使用时SDWebImage使用的机制

时间:2017-12-17 11:18:16

标签: uitableview uiimageview lazy-loading sdwebimage

这个问题是我的理解,因为我的代码工作正常。 我查看了SDWebImage,但它相当大,我无法确定我所质疑的机制是如何工作的。

好吧,假设我有一个充满UIImageViews的桌面视图(每个单元格内有一个),我在每个单元格中调用SDWebImage类别/扩展名,然后从网络上懒惰加载图像。

使用新下载的图像更新屏幕上的单元格而不重新加载tableview会采用什么机制?

我问这个,因为我很惊讶地发现,当使用SDWebImage扩展时,我的每个单元格的imageViews图像一旦下载了相应的图像就会弹出。

我的印象是我必须重新加载tableView,而是在图像可用时,每个单元格imageView'自动'更新!

这是如何工作的? SDWebImage是否保留对它正在使用的每个cell / imageView的引用?

2 个答案:

答案 0 :(得分:3)

如果您在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

答案 1 :(得分:3)

SDWebImage将加载的图像插入到已查询加载的UIImageView实例中。

使用UITableViewCell,你必须要避免细胞中不相关的图像,这就是原因:

  1. 想象一下,您请求最顶层可见单元格中第一个项目URL firstURL的图片。
  2. 向下滚动表格,然后发生以下情况:
    • 前一个最顶层的单元格被重用并显示在表格的底部。
    • 查询最后一个单元格URLlastURL)的图片。
  3. firstURL加载完成后,相应的图片会插入到最后一个单元格的图片视图中,因为它是已查询firstURL加载的图片视图。
  4. lastURL加载完成,相应的图像插入到最后一个单元格的图像视图中。
  5. 步骤3和4可能看起来像在图像视图中快速闪烁。

    为避免这种情况,您需要在prepareForReuse子类的UITableViewCell方法实现中解决先前下载的取消。

    e.g。

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