缓存下载的图像:FileManager / CachePolicy / URLCache / NSCache?

时间:2017-09-25 14:53:58

标签: ios nsurlsession nsurlrequest nsurlcache nscache

我需要实现具有N个单元格的表视图的常见场景,其中每个单元格需要下载要在其中显示的图像。

调用以下载图像的服务协议可以是HTTP或HTTPS。

我这样使用URLSessionDownloadTask

func downloadImage(urlStr: String, completion: @escaping (UIImage?, Error?) -> Void) {
    let url = URL(string: urlStr)
    let request = URLRequest(url: url!)
    let task = session.downloadTask(with: request, completionHandler: {
        (fileUrl, response, error) in
        // Call 'completion' depending on result
    })

    task.resume()
}

其中session是具有默认配置和关联操作队列的URLSession

self.session = URLSession(configuration: configuration, delegate: nil, delegateQueue: self.operationQueue)

所以,我想要的是避免下载已经下载的图像。我希望他们有一些到期时间。

我已经阅读了一些文章和帖子,我并不完全清楚我发现的选项之间的差异:

A. 使用FileManager将图像实际存储为文件,并在检查到期时间后将其删除。

B。设置cachePolicy的{​​{1}}属性。

C。使用URLRequest

D。使用URLCache

关于A:

  1. 将图像存储为文件和使用缓存之间的实际区别是什么?可以让文件存储提供缓存不具有的任何好处吗?这些图像与用户无关,我可以在需要时从服务器下载它们。
  2. 关于B:

    1. 关于这一点我读了Apple's documentation,但我不完全理解我的情况是否应该使用NSCache
    2. 此选项如何实际运作?设置策略就足够了,然后您不必关心其他任何事情?现在已经下载并缓存了图像被要求下载的NSURLRequestUseProtocolCachePolicy如何?
    3. 关于C:

      1. 如何正确实施?如果这是最好的方法,有人可以给我一个示例/教程吗?那么到期日呢?
      2. 关于D:

        1. 我找到了一个我理解的例子,但这是一个很好的方法,有以前的选择吗?那里的失效日期呢?
        2. 总结:哪种选项对我的方案最有效和最合适,为什么?

1 个答案:

答案 0 :(得分:0)

根据我推断的问题“我想要的是避免下载已下载的图片。我希望他们有一些到期时间。”

为避免再次下载图像,您可以实现以下用例,使用图像本身的URL将图像存储在NSCache中。

这就像link中讨论的那样。

对于到期时间情况,如果要在特定到期时间删除所有图像,则只需检查该方案并清空缓存。

对于您希望删除单个图像的情况,根据其过期时间,您可以检查服务器对过期密钥的响应,并在限制为止时再次删除缓存被破坏了。