【问题标题】:Using disk cached images if present in Alamofire Images使用磁盘缓存的图像(如果存在于 Alamofire 图像中)
【发布时间】:2016-08-30 14:36:21
【问题描述】:

我正在使用AlamofireImage 库来缓存下载的图像。

代码:

import UIKit
import AlamofireImage

class ViewController: UIViewController {

    @IBOutlet weak var firstImageView: UIImageView!
    @IBOutlet weak var secondImageView: UIImageView!

    let downloader = ImageDownloader()
    let URLRequest = NSURLRequest(URL: NSURL(string: "https://httpbin.org/image/jpeg")!)

    override func viewDidLoad() {
        super.viewDidLoad()
        requestFirstImage()
    }

    func requestFirstImage() {
        downloader.downloadImage(URLRequest: URLRequest) { response in
            print(response.request)
            print(response.response)
            debugPrint(response.result)
            if let image = response.result.value {
                self.firstImageView.image = image
                self.requestSecondImage()
            }
        }
    }

    func requestSecondImage() {
        downloader.downloadImage(URLRequest: URLRequest) { response in
            print(response.request)
            print(response.response)
            debugPrint(response.result)
            if let image = response.result.value {
                self.secondImageView.image = image
            }
        }
    }
}

日志:

正如日志显示的那样,请求了第一个图像,而从缓存中获取了第二个图像。无需额外请求,图像立即显示。

我希望当我重新启动应用程序时,即使是从缓存中获取的第一张图片,但 Log 仍然保持不变。我查看了Library/Caches/.../fsCachedData,图像就在那里,可以提取了。

问题: 我在这里缺少什么?我需要在后续请求中从磁盘缓存中获取第一张图像。

【问题讨论】:

  • 你在服务器上正确设置了缓存控制头吗?
  • 我想获取本地存储的图像,即使缓存控制头没有解决。如果我的理解是正确的,即使离线,我也应该获取存储的图像。不是这里的情况
  • 那么你必须明确地使用 AutoPurgingImageCache。在 AlamoFireImage 主页上的自述文件中查找示例。
  • ImageDownloader 默认使用设置imageCache 使用AutoPurgingImageCache。即使从磁盘脱机加载,您也可以运行示例吗?
  • 聊天链接 404s..?你得出了什么结论?

标签: ios swift alamofire alamofireimage


【解决方案1】:

这种方法将图像请求保存在磁盘上,只要它们的缓存控制最大年龄表示并且空间可用。如果要设置自己的最大年龄,则必须将custom NSURLCache 设置为diskCache,您必须在storeCachedResponse 方法中返回修改后的cachedResponse。顺便说一句,内存缓存由ImageDownloader中的AutoPurgingImageCache处理。 使用此方法设置您的downloader

func diskImageDownloader(diskSpaceMB: Int = 150) -> ImageDownloader {

        let diskCapacity = diskSpaceMB * 1024 * 1024
        let diskCache = NSURLCache(memoryCapacity: 0, diskCapacity: diskCapacity, diskPath: "image_disk_cache")
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        configuration.URLCache = diskCache
        let downloader = ImageDownloader(configuration: configuration)
        UIImageView.af_sharedImageDownloader = downloader
        return downloader
    }

@kishorer747 于 08/09/16 更新:

NSURLCache memoryCapacity 为零,因为我不希望将图像请求响应保存在缓存中以节省内存。内存中的AutoPurgingImageCache 应该只将请求 url 的图像作为键保存。您可以按如下方式修改我的示例方法,为图像内存缓存设置所需的cacheCapacitycachePurgeCapacity

let cacheCapacity = 100 * 1024 * 1024
let cachePurgeCapacity = 60 * 1024 * 1024
let imageCache: ImageRequestCache = AutoPurgingImageCache(memoryCapacity: cacheCapacity, preferredMemoryUsageAfterPurge: cachePurgeCapacity)
let downloader = ImageDownloader(configuration: configuration, imageCache: imageCache)

【讨论】:

  • 为什么 memoryCapacity 为 0?这是否意味着您没有在内存中缓存图像?如果我想,我可以在那里指定任何大小而不是 0 吗?
  • @kishorer747 我为您更新了我的答案,以展示我将如何处理图像内存缓存。
  • 我按照您的回答设置了 20 MB 的磁盘缓存。它完美地工作。但是当缓存已满时会发生什么?我仍然可以使用此下载器下载图像,对吗?由于达到 20MB 的限制,最近的图像是否会被旧图像替换?
  • @kishorer747 磁盘缓存由 NSURLCache 处理。因此,我认为随机图像请求被清除like this answer suggests,新的图像响应可以存储在磁盘上。要更改磁盘清理行为,您必须编写自己的自定义 NSURLCache
  • @FBente 谢谢,它也帮助了我。但是,我并不完全清楚我应该如何下载图像以使它们缓存。像 Alamofire.request(url).responseImage{ ... } 仅此而已,或者在闭包内我必须手动将图像添加到缓存中,例如 UIImageView.af_sharedImageDownloader.imageCache?.add(...) ?对我来说只有最后一个选项有效,但是这是唯一的方法吗?
猜你喜欢
  • 2016-07-16
  • 2017-10-18
  • 2014-06-16
  • 2016-09-30
  • 2019-10-15
  • 2017-07-02
  • 2013-02-10
  • 1970-01-01
  • 2017-07-24
相关资源
最近更新 更多