取消对Alamofire图像的请求



基本信息:我有一个tableView,每个tableView单元格都包含一个图像和几个标签。当tableView滚动时,我使用tableView预取数据方法进行API调用以获取数据。

问题:有时我会看到某个特定单元格显示其他单元格的图像。当我的滚动速度比正常速度快一点时,就会发生这种情况。注意:为了克服这个问题,我只需要滚动表格向上/向下查看

尝试过的事情:我在准备重用方法中将imageView设置为nil。

我得出的结论是:通过调试该问题,我了解到一旦看到细胞,我就会使用Alamofire image发出图像请求,但在收到响应之前我会滚动它。因此,可能发生的情况是,在收到响应时,它正在为单元格设置图像,但由于我正在重用单元格,该单元格不可见。该单元格包含一些其他数据。

如果单元格不可见,请告诉我如何取消请求。如果我在问题中遗漏了什么,请告诉我。

在这种情况下,我所做的是将单元格的标记设置为与行号匹配。

当图像请求完成时,我会检查它是否仍然有相同的标记(如果它被重用,标记就会被更改)。

类似这样的东西,在cellForRowAt indexPath:中

cell.tag = indexPath.row
ImageService.shared.getImage(completion: { (image) in
if let image = image, cell.tag == indexPath.row {
//apply image
}
}

这不会取消请求,但如果单元格不再位于同一位置,则会忽略结果。

之所以会发生这种情况,是因为tableView重用单元格,如果它在队列中有一个图像下载,并且您滚动并完成下载,它会显示下载的图像几秒钟,直到正确的图像下载。

af_setImage方法中使用占位符。它将解决你的问题

imageView.af_setImage(withURL: URL(string: img)!, placeholderImage: UIImage(named: "product_placeholder")

最新更新