URLSession没有缓存大图像URL响应:为什么?

时间:2018-02-26 13:20:38

标签: ios caching nsurlsession nsurlrequest nsurlcache

我使用URLSession数据任务从后端下载多个JPG图像。由于图像的大小相当大(~500 KB),我想缓存各自的响应,直到它们已经过期(即它们已超过其最大年龄)。

这是我用于下载图片的代码:

let request = URLRequest(url: url, 
                          cachePolicy: .useProtocolCachePolicy, 
                          timeoutInterval: 10.0)

let task = URLSession.shared.dataTask(with: request) { (data, _, error) in

    // Error:
    guard let imageData = data, error == nil, let image = UIImage(data: imageData) else {
        DispatchQueue.main.async {
            completion(nil)
        }
        return
    }

    // Success:
    DispatchQueue.main.async {
        completion(image)
    }
}

task.resume()

奇怪的是,除了一个以外,所有图像的缓存效果都很好。出于某种原因,此特定图片始终再次下载 - 其响应未缓存

我可以发现的响应之间的唯一区别是没有缓存相应响应的图像具有最大的文件大小。而所有其他图像都是< 500kB,该特定图像略微> 500 kB。

我已经使用共享缓存大小并将其设置为一个非常高的值,但没有效果:

URLCache.shared = URLCache(memoryCapacity: 1000 * 1024 * 1024, 
                           diskCapacity:   1000 * 1024 * 1024, 
                           diskPath:       nil)

我已检查 Cache-Control 标头字段是否已在响应中正确设置:

Cache-Control: public, max-age=86400

并且Age标头字段始终低于max-age,例如:

Age: 3526

单个响应不被缓存的原因是什么?

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

这不是为什么共享URLSession不会缓存图片的问题的答案,而我仍然对此问题的任何提示或答案感激不尽。< / p>

然而,在用我的代码试验了一段时间后,我发现(无论出于何种原因)当我使用具有默认配置的自定义URL会话而不是默认共享时,响应 始终被缓存网址会话:

let urlSession = URLSession(configuration: .default)

所以,如果我使用:

let task = urlSession.dataTask(with: request) { ... }

而不是

let task = URLSession.shared.dataTask(with: request) { ... }

缓存按预期工作 - 无论黑魔法负责什么。

我在docs for URLSession.shared中找到了一些提示:

  

使用共享会话时,通常应该避免使用   自定义缓存,...

     

换句话说,如果您正在使用缓存,cookie,   您可能应该是身份验证或自定义网络协议   使用默认会话而不是共享会话。