基本信息: 我有一个tableView,每个tableView单元格包含图片和少量标签。 我使用tableView 预取数据方法进行API调用,以在tableView滚动时获取数据。
问题: 有时我会看到一个特定的单元格显示其他单元格的图像。 当我滚动速度比正常速度快一点时,就会发生这种情况。 注意:为了解决这个问题,我只需要向上/向下滚动tableView
尝试过的事情: 我已在准备重用方法中将imageView设置为nil。
我得出的结论: 通过调试问题,我了解到一旦看到了一个单元格,便可以使用Alamofire Image发出图像请求,但是在收到响应之前会对其进行滚动。 因此,可能发生的情况是,在接收到响应时,它正在为该单元格设置图像,但是由于我正在重复使用这些单元格,因此该单元格不可见。该单元格包含其他数据。
如果单元格不可见,请让我知道如何取消请求。 让我知道我是否有疑问。
答案 0 :(得分:1)
之所以发生这种情况,是因为tableView重用了单元格,并且如果队列中有图像下载并且您滚动并且下载完成,它将显示下载的图像几秒钟,直到正确的图像下载为止。
在af_setImage
方法中使用占位符。它会解决您的问题
imageView.af_setImage(withURL: URL(string: img)!, placeholderImage: UIImage(named: "product_placeholder")
答案 1 :(得分:0)
在这种情况下,我要做的是将单元格的标签设置为与行号匹配。
当图像请求完成时,我检查它是否仍然具有相同的标签(如果重复使用,标签将被更改)。
在cellForRowAt indexPath
中这样的事情:
cell.tag = indexPath.row
ImageService.shared.getImage(completion: { (image) in
if let image = image, cell.tag == indexPath.row {
//apply image
}
}
这不会取消请求,但是如果单元格不再位于同一位置,它将忽略结果。