【问题标题】:Caching downloaded images: FileManager / CachePolicy / URLCache / NSCache?缓存下载的图像:FileManager / CachePolicy / URLCache / NSCache?
【发布时间】:2017-09-25 14:53:58
【问题描述】:

我需要实现具有 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()
}

其中sessionURLSession,具有默认配置和关联的操作队列:

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

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

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

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

B. 设置URLRequestcachePolicy 属性。

C. 使用URLCache

D.使用NSCache

关于A:

  1. 将图像存储为文件和使用缓存之间实际上有什么区别?文件存储能否提供缓存所没有的任何好处?这些图片与用户无关,我可以在需要时从服务器下载它们。

关于乙:

  1. 我阅读了 Apple's documentation 的相关信息,但我不完全了解在我的场景中是否应该使用 NSURLRequestUseProtocolCachePolicy
  2. 这个选项实际上是如何工作的?设置策略就足够了,然后您不必关心其他任何事情?现在要求下载图片的URLRequest如何已经下载并缓存了?

关于C:

  1. 应该如何正确实施?如果这是最好的方法,有人可以给我一个例子/教程吗?有效期呢?

关于 D:

  1. 我找到了一个我理解的示例,但是使用以前的选项会是一个好方法吗?到期日期也在这里?

总而言之:哪个选项对我的场景最有效和最合适,为什么?

【问题讨论】:

    标签: ios nsurlsession nsurlrequest nsurlcache nscache


    【解决方案1】:

    根据我对您的问题的推断“我想要避免下载已经下载的图像。我希望它们有一些过期时间。”

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

    这类似于link 中讨论的内容。

    对于过期时间的情况,如果您想在特定的过期时间删除所有图像,那么只需检查该场景并清空缓存。

    对于您想要删除单个图像的情况,根据它们的到期时间,您可以检查来自服务器的响应以获取到期密钥,并在限制时再次删除缓存被破坏了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-25
      • 2022-12-04
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 2019-06-11
      • 2013-02-10
      • 1970-01-01
      相关资源
      最近更新 更多