一旦使用SDWebImage完成下载,如何决定是否将图像分配给UIImageView?

时间:2015-12-09 07:45:31

标签: ios swift uitableview sdwebimage

SDWebImageUIImageView的扩展程序。有一种方法:

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解决了这个问题,但事实并非如此,或者我错过了......

2 个答案:

答案 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并明确设置占位符图像。