取消对 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 图像的请求的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 请求大约需要 10 秒

Alamofire 从多个请求中取消一个请求

我如何使用 Alamofire 取消多个请求?

由于对成员 jsonObject 的不明确引用,我无法编译我的 alamofire 代码。为啥?

在 swift 中使用 Alamofire 取消 api 请求

取消一个带有特定 url 的 Alamofire 下载请求