2

当表格行进入视图时,我设法让一些代码在获取 Instagram 图片(通过 Alamofire)的地方工作。但是,一旦获取,当表格行再次出现时,我不希望再次调用。我怎样才能避免这种行为?

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    let url = places[indexPath.row].url
    if let c = cell as? PlaceTableViewCell {
        print("Downloading Image")
        Alamofire.request(url, method: .get).responseImage { response in
            guard let image = response.result.value else {
                print("Error downloading image")
                return
            }
            c.photoImageView.image = image
        }

    }
}
4

2 回答 2

4

如果您已经在使用,最简单的方法AlamoFireAlamoFireImage. 它内置了您可以使用的缓存机制。例如:

let imageCache = AutoPurgingImageCache()

let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/image/png")!)
let avatarImage = UIImage(named: "avatar")!.af_imageRoundedIntoCircle()

// Add
imageCache.add(avatarImage, for: urlRequest, withIdentifier: "circle")

// Fetch
let cachedAvatarImage = imageCache.image(for: urlRequest, withIdentifier: "circle")

// Remove
imageCache.removeImage(for: urlRequest, withIdentifier: "circle")

对于您的具体情况,我们实际上可以做一些更简单的事情。AlamoFireImage 包含UIImageView为您的需要量身定制的扩展。如果图像已经下载,这应该从共享缓存加载图像。

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    let url = places[indexPath.row].url
    if let c = cell as? PlaceTableViewCell {
        print("Downloading Image")
        c.photoImageView.af_setImage(withURL: url)
    }
}

您还可以使用一些可选参数来获得有用的附加功能,例如在图像加载时或加载失败时的占位符图像。

c.photoImageView.af_setImage(withURL: url, placeholderImage: placeholderImage)

或完成块

c.photoImageView.af_setImage(withURL: url, completion: { response in
    guard let image = response.result.value else {
        print("Error downloading image")
        return
    }
    c.photoImageView.image = image
})
于 2017-04-18T15:47:41.357 回答
1

我建议您使用一些第三方库(例如https://github.com/onevcat/Kingfisher)。这样,您将拥有图像缓存,并且将来不必再次下载。

但是,如果您不想使用更多第三方库,您可以创建图像数组并在下载后将其放入数组中。将数组实例化为与数据数组相同的大小。然后,您的代码将如下所示:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    let url = places[indexPath.row].url
    if let c = cell as? PlaceTableViewCell {
        print("Downloading Image")
        if let image = arrayOfImages[indexPath.row] {
            c.photoImageView.image = image
        }
        else {
            Alamofire.request(url, method: .get).responseImage { response in
                guard let image = response.result.value else {
                    print("Error downloading image")
                    return
                }
                c.photoImageView.image = image
                self.arrayOfImages[indexPath.row] = image
            }
        }
    }
}
于 2017-04-18T15:49:59.237 回答