取消对 Alamofire 图像的请求
Posted
技术标签:
【中文标题】取消对 Alamofire 图像的请求【英文标题】:Cancel request for Alamofire image 【发布时间】:2019-02-11 18:31:41 【问题描述】:基本信息: 我有一个 tableView 和每个 tableView 单元格包含一个图像和几个标签。 我使用 tableView prefetch data 方法进行 API 调用以在 tableView 滚动时获取数据。
问题: 有时我会看到一个特定的单元格显示其他单元格的图像。 当我滚动速度比正常速度快一点时,就会发生这种情况。 注意:为了克服这个问题,我只需要向上/向下滚动 tableView
尝试过的事情: 我在 prepare for reuse 方法中将 imageView 设置为 nil。
我得出的结论: 通过调试问题,我了解到一旦单元格可见,我会使用 Alamofire Image 发出图像请求,但在收到响应之前我会滚动它。 因此,可能发生的情况是,在收到响应时,它正在为单元格设置图像,但由于我正在重用单元格,所以该单元格不可见。该单元格包含一些其他数据。
如果单元格不可见,请告诉我如何取消请求。 如果我在问题中遗漏了什么,请告诉我。
【问题讨论】:
在这种情况下,您可以使用一些框架,例如 . Kingfisher、Haneke 等 bcoz 很快就会缓存图像、内存问题等。这些都由上述 pod 处理。 我认为这些是由 AlamofireImage 处理的 AlamofireImage 处理获取和缓存,但这些库可以提供的远不止这些。就像在单元格中设置图像异步一样 - 它在这些 pod 中是免费的。随时检查 bwt 取消不会解决您的问题,如果您再次想要图像,您最终会再次获取。 【参考方案1】:在这种情况下我所做的是将单元格的标签设置为与行号匹配。
当图像请求完成后,我检查它是否仍然具有相同的标签(如果它被重复使用,标签将被更改)。
类似的东西,在cellForRowAt indexPath
:
cell.tag = indexPath.row
ImageService.shared.getImage(completion: (image) in
if let image = image, cell.tag == indexPath.row
//apply image
这不会取消请求,但如果单元格不再位于同一位置,则会忽略结果。
【讨论】:
此解决方案正在运行,谢谢。但唯一的问题是,如果您有一个长列表并且用户快速滚动它,placeholder
将显示很长时间,然后所有请求都不会完成。反正比换像100次要好。另外,我更喜欢将tag
设置为UiImageView
,而不是Cell
【参考方案2】:
发生这种情况是因为 tableView 重用了单元格,并且如果它在队列中有图像下载并且您滚动并且下载完成,它会显示下载的图像几秒钟,直到正确的图像下载。
在af_setImage
方法中使用占位符。它会解决你的问题
imageView.af_setImage(withURL: URL(string: img)!, placeholderImage: UIImage(named: "product_placeholder")
【讨论】:
这对上述情况没有帮助。因为每次占位符都会用新图像更改,如果您快速滚动,则会显示图像。以上是关于取消对 Alamofire 图像的请求的主要内容,如果未能解决你的问题,请参考以下文章
由于对成员 jsonObject 的不明确引用,我无法编译我的 alamofire 代码。为啥?