下载后检查单元格是否仍然可见

有时下载的时间比显示单元格的时间长。在这种情况下,可能会发生下载的图像显示在错误的单元格中。要解决此问题,我们无法使用 UIImageView 扩展

我们仍将使用 Alamofire 但是我们将使用完成处理程序来显示图像。

在这种情况下,我们仍然需要一个 tableView,其中包含一个包含 imageView 的单元格。在 cellForRowAt:方法中,我们将使用以下代码下载图像:

let placeholderImage = UIImage(named: "placeholder")!
imageView.image = placeholderImage

let url = URL(string: "https://httpbin.org/image/png")!

Alamofire.request(url!, method: .get).responseImage { response in
    guard let image = response.result.value else { return }

    if let updateCell = tableView.cellForRow(at: indexPath) {
        updateCell.imageView.image = image
    }
}

在此示例中,我们首先将图像设置为占位符图像。后来,我们下载的图片用的 request 方法 Alamofire 。我们将 url 作为第一个参数传递,因为我们只想获取图像,我们将使用 .get HTTP 方法。由于我们正在下载图像,我们希望响应是图像,因此我们使用 .responseImage 方法。

下载图像后,调用闭包,首先我们确保下载的图像确实存在。然后我们通过检查 cellForRow(at:indexPath)不返回 nil 来确保单元格仍然可见。如果它没有发生任何事情,如果它没有,我们分配最近下载的图像。

如果用户已在单元格上滚动,则 updateCell 将为 nil 并且 if 语句返回 nil,则此最后一个 if 语句确保单元格仍然可见。这有助于我们防止在单元格中显示错误的图像。