当视图中的单元格时,避免再次获取图像

时间:2017-04-18 15:41:52

标签: ios swift swift3 alamofire alamofireimage

当桌面行进入视图时,我已设法获取一些代码,用于获取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
        }

    }
}

2 个答案:

答案 0 :(得分:4)

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

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
})

答案 1 :(得分: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
            }
        }
    }
}