UITableViewCell图片加载错误的图片

时间:2017-01-24 05:09:07

标签: ios uitableview

现在我下载图像,在可变字典中编辑故事,然后验证图像是否已经下载,如果没有,则下载并存储。作为密钥,我使用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

}

2 个答案:

答案 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。