在 UITableView 重新加载时从 SDWebImage 设置图像

Posted

技术标签:

【中文标题】在 UITableView 重新加载时从 SDWebImage 设置图像【英文标题】:Setting Image from SDWebImage on UITableView Reload 【发布时间】:2017-09-07 05:46:48 【问题描述】:

我有一个 UITableView 中的单元格列表。图片正在通过单元格内的以下方法下载

self.profileImage.sd_setImage(with: URL(string: profileURL), completed:  (image, error, cache, url) in
                            if image != nil 
                                self.profileImage.image = image
                             else 
                                print("didn't load image")
                            
                        )

但是,在重新加载和重新加载 UITableView 时,该索引的前一个图像会被加载片刻,然后会出现该索引的更新图像。

现在我的理论是发生以下情况(如果我错了,请纠正我)...

    检索到 URL 后立即下载图像。 该图像使用 SDWebImage 进行缓存。 TableView 重新加载,单元格中的数据发生变化。 SDWebImage 使用该 indexPath 的缓存图像而不是单元格。 (这里有问题) SDWebImage 再次下载该单元格的 URL 并刷新图像。

如果这是正确的,我需要执行以下操作...

    检索到 URL 后立即下载图片。 使用 SDWebImage 缓存图像。 TableView 重新加载,单元格中的数据发生变化。 使用该单元格的缓存图像。

我是否使用了错误的方法来设置 self.profileImage?

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

1. 检索到 URL 后立即下载图片。 2.使用 SDWebImage 缓存图片。

你使用这个代码

let url = NSURL(string: "https://test.com/upload/image.jpg")!

self.imageD.sd_setImage(with: url as URL!, placeholderImage: UIImage(named: "default_logo"), options: .transformAnimatedImage, progress: nil, completed: nil)

这个 default_logo 放在 Assets.xcassets

3.TableView 重新加载,单元格中的数据发生变化。

self.tableView.reloadData()

【讨论】:

这将删除下载的图像并将其替换为占位符图像。但是,当 UITableView 重新加载时,它可以完美地工作。你知道我如何让它们在 viewDidLoad 时显示吗? 没关系,只是将 self.profileImage.image = image 卡在完成块中似乎现在可以工作了。【参考方案2】:

如果您使用 UITableViewCell 配置单元格,则可以覆盖方法 prepareForReuse() 以清除旧图像,例如:

override func prepareForReuse() 
    super.prepareForReuse()
    profileImage.image = nil

这样就不会出现旧的缓存图片了。

【讨论】:

以上是关于在 UITableView 重新加载时从 SDWebImage 设置图像的主要内容,如果未能解决你的问题,请参考以下文章

重新加载时从 sqlite 数据库中获取新数据

从 UITableViews 保存文本

防止uitableView重新加载

在 UITableView 中的 UINib 中重新加载 UITableView

重新加载 UITableView 而不重新加载标题部分

等到 UITableview 完成重新加载