这个问题是我的理解,因为我的代码工作正常。 我查看了SDWebImage,但它相当大,我无法确定我所质疑的机制是如何工作的。
好吧,假设我有一个充满UIImageViews的桌面视图(每个单元格内有一个),我在每个单元格中调用SDWebImage类别/扩展名,然后从网络上懒惰加载图像。
使用新下载的图像更新屏幕上的单元格而不重新加载tableview会采用什么机制?
我问这个,因为我很惊讶地发现,当使用SDWebImage扩展时,我的每个单元格的imageViews图像一旦下载了相应的图像就会弹出。
我的印象是我必须重新加载tableView,而是在图像可用时,每个单元格imageView'自动'更新!
这是如何工作的? SDWebImage是否保留对它正在使用的每个cell / imageView的引用?
答案 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)
答案 1 :(得分:3)
SDWebImage
将加载的图像插入到已查询加载的UIImageView
实例中。
使用UITableViewCell
,你必须要避免细胞中不相关的图像,这就是原因:
URL
firstURL
的图片。URL
(lastURL
)的图片。firstURL
加载完成后,相应的图片会插入到最后一个单元格的图片视图中,因为它是已查询firstURL
加载的图片视图。lastURL
加载完成,相应的图像插入到最后一个单元格的图像视图中。步骤3和4可能看起来像在图像视图中快速闪烁。
为避免这种情况,您需要在prepareForReuse
子类的UITableViewCell
方法实现中解决先前下载的取消。
e.g。
- (void)prepareForReuse {
[super prepareForReuse];
[self.imageView sd_cancelCurrentImageLoad];
self.imageView.image = <placeholder image>;
}