gpt4 book ai didi

ios - URLSession : Why? 未缓存大图像 URL 响应

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:27 25 4
gpt4 key购买 nike

我使用 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()

奇怪的是,这对于缓存除一张图像以外的所有图像都非常有效。出于某种原因,这个特定的图像总是被再次下载——它的响应没有被缓存

我能发现的响应之间的唯一区别是未缓存相应响应的图像具有最大的文件大小。虽然所有其他图像都小于 500 kB,但这张特定图像略大于 500 kB。

我试过共享缓存大小并将其设置为高得离谱的值,但没有任何效果:

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

我已检查响应中是否正确设置了 Cache-Control header 字段:

Cache-Control: public, max-age=86400

并且Age头字段总是在max-age之下,例如:

Age: 3526

单个响应未被缓存的原因可能是什么?

我该如何解决这个问题?

最佳答案

这不是对为什么共享 URLSession 不缓存图像的问题的回答,我仍然感谢对该问题的任何提示或答案

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

let urlSession = URLSession(configuration: .default)

所以如果我使用:

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

代替

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

缓存按预期工作——不管是什么黑魔法造成的。 🤔


我在 docs for URLSession.shared 中发现了一点提示虽然:

When working with a shared session, you should generally avoid customizing the cache, ...

In other words, if you’re doing anything with caches, cookies, authentication, or custom networking protocols, you should probably be using a default session instead of the shared session.

关于ios - URLSession : Why? 未缓存大图像 URL 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com