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