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

Woo*_*ock 5 lazy-loading uitableview uiimageview sdwebimage

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

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

使用新下载的图像更新屏幕上的单元格,而无需重新加载tableview?

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

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

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

Eug*_*nyk 3

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

由于UITableViewCell您必须采取一些技巧来避免单元格中出现不相关的图像,原因如下:

  1. 假设您请求最顶部可见单元格上第URL一项 ( )的图像。firstURL
  2. 您向下滚动表格,会发生以下情况:
    • 以前最上面的单元格被重复使用并显示在表格的底部。
    • 查询图像URL中最后一个单元格 ( lastURL) 的内容。
  3. firstURL加载完成,相应的图像被插入到最后一个单元格的图像视图中,因为它是firstURL已查询加载的图像视图。
  4. lastURL加载完成,相应的图像被插入到最后一个单元格的图像视图中。

步骤 3 和 4 在图像视图中可能看起来像是快速闪烁。

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

例如

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