现在我下载图像,在可变字典中编辑故事,然后验证图像是否已经下载,如果没有,则下载并存储。作为密钥,我使用indexPath
。
这个代码有点工作,但是从我做的测试中,如果我滚动太快,单元格图像将加载错误的一个,并且在分裂一秒后它将加载正确的一个(替换错误的图像)。
我在调用方法后总是清除我的缩略图(imageView)所以我不知道为什么我会得到这个错误。
虽然我可能if(self.imageCache.object(forKey: cacheKey) != nil)
语句是真的,这就是为什么我会得到多个图像,但是当我向下滚动时,断点并没有立即停止。
有什么想法吗?
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MovieCellController
cell.thumbnail.image = UIImage()
let cacheKey = indexPath.row
if(self.imageCache.object(forKey: cacheKey) != nil)
{
cell.thumbnail.image = self.imageCache.object(forKey: cacheKey) as? UIImage
}
else
{
DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
if let url = NSURL(string: self.moviesCollection[indexPath.row].imageLink) {
if let data = NSData(contentsOf: url as URL) {
let image: UIImage = UIImage(data: data as Data)!
self.imageCache.setObject(image, forKey: cacheKey as NSCopying)
DispatchQueue.main.async(execute: {
cell.thumbnail.image = image
})
}
}
}
}
cell.name.text = moviesCollection[indexPath.row].name
return cell
}
答案 0 :(得分:0)
正在发生这种情况,因为细胞被重复使用,因为当快速滚动时,似乎会分配另一个细胞的图像,但如果事实上它是前一个细胞的图像被重复使用。
在单元格的joins(:address).where("addresses.zipcode IN(?) AND accounts.created_at >= ? AND accounts.created_at <= ?", zipcodes, from_date, to_date)
方法中,将imageView的图像设置为nil。比如,prepareForReuse
答案 1 :(得分:0)
因为细胞被重复使用。 重用单元保留其旧数据。 新的图像下载将花费几秒钟,以便重用的单元格不能立即改变图像。
下载新图像时可以使用占位符图像。 或者您可以使用第三方库 - SDWebImage。