了解 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.h
class里面的方法。
如您所见 class 本身 UIImageView
@implementation UIImageView (WebCache)
SDWebImage
将加载的图像插入到已查询加载的 UIImageView
实例中。
使用 UITableViewCell
时,您必须有点技巧才能避免单元格中出现不相关的图像,原因如下:
- 假设您请求了最顶部可见单元格中第一项 (
firstURL
) URL
的图像。
- 您向下滚动 table,然后发生以下情况:
- 原来最上面的单元格被重新使用并出现在 table 的底部。
- 为最后一个单元格 (
lastURL
) 的 URL
查询图像。
firstURL
加载完成,相应的图片插入到最后一个单元格的图片视图中,因为它是查询firstURL
加载的图片视图。
lastURL
加载完成,相应的图片插入到最后一个单元格的图片视图中。
步骤 3 和 4 在图像视图中可能看起来像快速闪烁。
为避免这种情况,您需要在 UITableViewCell
子类的 prepareForReuse
方法实现中解决先前下载的取消问题。
例如
- (void)prepareForReuse {
[super prepareForReuse];
[self.imageView sd_cancelCurrentImageLoad];
self.imageView.image = <placeholder image>;
}
这个问题是为了我的理解,因为我的代码工作正常。 我查看了 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.h
class里面的方法。
如您所见 class 本身 UIImageView
@implementation UIImageView (WebCache)
SDWebImage
将加载的图像插入到已查询加载的 UIImageView
实例中。
使用 UITableViewCell
时,您必须有点技巧才能避免单元格中出现不相关的图像,原因如下:
- 假设您请求了最顶部可见单元格中第一项 (
firstURL
)URL
的图像。 - 您向下滚动 table,然后发生以下情况:
- 原来最上面的单元格被重新使用并出现在 table 的底部。
- 为最后一个单元格 (
lastURL
) 的URL
查询图像。
firstURL
加载完成,相应的图片插入到最后一个单元格的图片视图中,因为它是查询firstURL
加载的图片视图。lastURL
加载完成,相应的图片插入到最后一个单元格的图片视图中。
步骤 3 和 4 在图像视图中可能看起来像快速闪烁。
为避免这种情况,您需要在 UITableViewCell
子类的 prepareForReuse
方法实现中解决先前下载的取消问题。
例如
- (void)prepareForReuse {
[super prepareForReuse];
[self.imageView sd_cancelCurrentImageLoad];
self.imageView.image = <placeholder image>;
}