【发布时间】:2018-04-21 23:23:37
【问题描述】:
我正在使用 Kingfisher 下载和缓存我的图像。我正在使用 CustomImageView 下扩展 ImageView 的自定义类。我还使用自定义 UITableViewCell 在 CustomCell 类文件的 didSet 属性中调用 loadImage 方法。
下面的方法 loadImage 是所有魔法发生的地方。
class CustomImageView : UIImageView {
var lastUrlLoaded: String?
func loadImage(url:String) {
lastUrlLoaded = url
ImageCache.default.retrieveImage(forKey: url, options: nil) { (image, cacheType) in
if let image = image {
self.image = image
return
}
else {
guard let url = URL(string: url) else { return }
self.kf.setImage(with: url, placeholder: nil, options: nil, progressBlock: nil) {
(image, error, cacheTye, _) in
if let err = error {
self.kf.indicatorType = .none
DispatchQueue.main.async {
self.image = #imageLiteral(resourceName: "no_image_available")
}
print ("Error loading Image:", err)
return
}
if url.absoluteString != self.lastUrlLoaded { return }
if let image = image {
ImageCache.default.store(image, forKey: url.absoluteString)
DispatchQueue.main.async {
self.image = image
}
}
}
}
}
}
// Custom TableViewCell -- NewsCell.file
class NewsCell: UITableViewCell {
var article: Article? {
didSet{
guard let image_url = article?.image_url else { return }
_image.kf.indicatorType = .activity
_image.loadImage(url: image_url, type: "news")
}
}
}
// METHOD in my NewsController
override func tableView(_ tableView: UITableView, cellForRowAt indexPath:
IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! NewsCell
cell.article = articles[indexPath.item]
return cell
}
我在快速滚动单元格时遇到问题,一些已加载的图像被用于错误的单元格。我已经研究并阅读了其他帖子,但没有答案对我有帮助。我了解它正在处理后台任务,但不确定如何解决它。如果有人可以帮助或指出我正确的方向,将不胜感激。
我在 stackoverflow 上看到并尝试过的解决方案:
- prepareForReuse 在自定义单元格中将图像设置为 nil。
- 在 cellforrowatindexpath 处将图像设置为零。
【问题讨论】:
-
您能否澄清一下:“当我快速滚动时.. 已加载的图像被用于错误的单元格”。所以,如果你不滚动,只是等待一切加载,一切看起来都很完美吗?如果你慢慢滚动,一切看起来都很完美?仅当您在发生异步图像加载时快速滚动时,图像才会出现错位。是这样吗?你的行高度是恒定的吗?所有图像的高度都相同吗?如果图像替换导致行高发生变化,您可能需要使用开始/结束更新。
-
因此,如果我缓慢滚动或不滚动视图,直到第一组单元格加载它们的图像,一切都会按预期加载——当我说快速滚动时,我指的是向上滚动和向下通过视图将在后台加载异步图像。我所有的图像都是相同的高度,不会影响单元格的高度。
-
好的,显示你的 cellforrowatindexpath 和 didset 来自你的 cell 类。
-
@ozzieozumo 我更新了 sn-p 以显示您询问的方法
-
好的,看起来你走在了正确的轨道上。现在,您说您已尝试“在 cellforrowatindexpath 处将图像设置为零”,但没有成功。它应该工作。确保使用此顺序:a)出队 b)无图像 c)设置文章 d)返回单元格。也许使用您尝试使用此技术的代码更新您的问题。
标签: ios swift uitableview uicollectionviewcell kingfisher