【发布时间】:2018-08-05 23:18:43
【问题描述】:
我使用URLSession 数据任务从后端下载多个 JPG 图像。由于图像的大小相当大(~500 KB),我想缓存相应的响应,直到它们过期(即它们已经超过了它们的 max-age)。
这是我用来下载图片的代码:
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()
奇怪的是,这非常适用于缓存除一张之外的所有图像。出于某种原因,此特定图像总是会再次下载 - 其响应未缓存。
我可以发现的响应之间的唯一区别是未缓存相应响应的图像具有最大的文件大小。虽然所有其他图像均小于 500 kB,但此特定图像略大于 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
单个响应没有被缓存的原因是什么?
我该如何解决这个问题?
【问题讨论】:
-
手动实现developer.apple.com/documentation/foundation/… 看看是否有任何变化可能是个好主意。
-
关于大小,请注意备注:...仅当满足以下所有条件时才缓存响应:...不大于磁盘缓存大小的约 5%。我>
-
这也是我的想法,但是我不能使用共享的
URLSession对象(必须在实例化时分配委托),创建自定义URLSession也可能会改变行为。跨度> -
我也阅读过文档中关于大小的说明,但我认为可以肯定地说,大小约为 500 KB 的图像不到 1000 MB 磁盘缓存的 5% ...
-
我认为如果你传入一个 nil 路径,你就不会期望得到一个磁盘缓存。你可能应该解决这个问题。但这仍然不能解释为什么它没有将其缓存在 RAM 中。
标签: ios caching nsurlsession nsurlrequest nsurlcache