SDWebImage
是UIImageView
的扩展程序。有一种方法:
sd_setImageWithURL(NSURL(string: url), placeholderImage: placeholder, options: options, completed: { image, error, cache, url in
//do sth after it is completed
})
但是在completed
块中,我无法决定是否允许SDWebImage
分配图像。 会自动分配,而不会向开发人员询问是否允许执行此操作。当我在滚动表格时将图片分配到UIImageView
内的UITableViewCell
时出现问题。
很明显,在完成下载之前,该单元格可能会被重用于不同的行,最后可能会出现不同的图像。
如何使用此库修复它?
在以下问题:Async image loading from url inside a UITableView cell - image changes to wrong image while scrolling中,有一个答案SDWebImage
解决了这个问题,但事实并非如此,或者我错过了......
答案 0 :(得分:2)
这不是必要的。如果您查看UIImageView类别的实现,您将看到:
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock {
[self sd_cancelCurrentImageLoad];
objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
这告诉你的是,你调用setImage它会取消与图像视图实例相关的下载。由于UITableView重用其视图,因此这不应成为问题。了解它们如何将imageView和URL关联在一起。
您的问题可能是您每次都没有将imageView的图像属性重置为nil。所以在cellForRow中你可能想要:
cell.imageView.image = nil
cell.imageView.sd_setImageWithURL(...)
答案 1 :(得分:1)
当您开始新的加载时,图像视图会取消任何当前加载。因此,如果重复使用图像视图,则可以避免此问题。
如果由于某种原因没有要设置新图像,则可以调用sd_cancelCurrentImageLoad
并明确设置占位符图像。