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

Understanding the mechanism used by SDWebImage when used in a UITableView

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

好吧,假设我有一个充满 UIImageView 的表格视图(每个单元格内有一个),我在每个表格视图上调用 SDWebImage Category/Extension 以从网络上延迟加载图像。

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

我问这个是因为我很惊讶地看到当使用 SDWebImage Extension 时,我的每个单元格的 imageViews 图像在下载相应图像后立即出现。

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

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

如果你在 UITableviewCell 中引用 UIImageview 那么你可以检查 SDWebImage 是一种 UIImageView class,所以不需要描述下载图像引用哪个图像视图,因为它的自我标识

让我告诉你一次.. 因为我们像这样请求单元格内的图像。

[cell.imgBrand sd_setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
    if (error != nil) {
        NSLog(@"%@", [error localizedDescription]);
    }
}];

第一行执行时,会调用UIImageView+WebCache.hclass里面的方法。 如您所见 class 本身 UIImageView

@implementation UIImageView (WebCache)

Class For SDWebCache UIImageView

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

使用 UITableViewCell 时,您必须有点技巧才能避免单元格中出现不相关的图像,原因如下:

  1. 假设您请求了最顶部可见单元格中第一项 (firstURL) URL 的图像。
  2. 您向下滚动 table,然后发生以下情况:
    • 原来最上面的单元格被重新使用并出现在 table 的底部。
    • 为最后一个单元格 (lastURL) 的 URL 查询图像。
  3. firstURL加载完成,相应的图片插入到最后一个单元格的图片视图中,因为它是查询firstURL加载的图片视图。
  4. lastURL加载完成,相应的图片插入到最后一个单元格的图片视图中。

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

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

例如

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