我正在尝试在我的应用程序中实现缓存,我正在使用具有后台配置的 NSURLSession 来满足我的大部分网络需求,它工作得很好,但是我添加了一个缓存对象,会话忽略它并总是转到服务器
我尝试将默认会话实例与缓存一起使用,系统使用缓存
我之前已经多次阅读过文档,但没有提到忽略后台任务的缓存对象
有谁知道这是一个错误还是什么
我正在尝试在我的应用程序中实现缓存,我正在使用具有后台配置的 NSURLSession 来满足我的大部分网络需求,它工作得很好,但是我添加了一个缓存对象,会话忽略它并总是转到服务器
我尝试将默认会话实例与缓存一起使用,系统使用缓存
我之前已经多次阅读过文档,但没有提到忽略后台任务的缓存对象
有谁知道这是一个错误还是什么
哇,我很久以前就问过这个问题,仍然没有答案。
说实话,我最终为这个使用了 DTS 令牌。
事实证明 NSURLSession 后台配置根本不支持兑现,无论您使用什么任务。
它是苹果公司的设计决定,记录不充分。
以下是我收到的 DTS 重播的一部分:
我正在回答您关于 NSURLSession 后台会话和 NSURLCache 之间关系的问题。你写了:
然后我将一个 NSURLCache 对象添加到我的配置中,NSURLSession 机制完全忽略了它。
的确。这是预期的行为,因为目前的情况是 NSURLSession 后台会话 /never/ 缓存。这有很多原因:
完全支持
URLCache
财产是不可行的。具体来说,我们不能允许您使用 NSURLCache 的自定义子类,因为这需要我们将您的代码加载到系统守护进程中(请记住,这里的实际工作是在您的应用程序暂停时由 NSURLSession 守护进程完成的,或者甚至终止)。即使我们将您限制为仅标准 NSURLCache 类的实例,事情仍然会变得棘手,因为我们希望将缓存使用的磁盘空间计入您的应用程序。鉴于您的应用程序和 NSURLSession 守护程序之间的安全障碍,这很难协调。
这里有一个哲学脱节。NSURLSession 后台会话旨在用于少量大传输,而 NSURLCache 仅在您进行大量小传输时才真正有用。
注意:通过 NSURLSession 后台会话运行大量小传输可能会由于其他原因导致问题。有关这方面的更多信息,请阅读以下 DevForums 帖子:
- NSURLSession 的恢复速率限制器
https://forums.developer.apple.com/message/42352#42352
- 转移到更少、更大的转移
https://forums.developer.apple.com/thread/14853
如果你希望 NSURLSession 工程师重新考虑这个缓存设计决定,你应该随时提交一个错误请求支持。确保详细解释您的用例。
https://developer.apple.com/bug-reporting/
您的错误可能会以“行为正确”的形式返回,但询问也无妨。
关于错误的主题,我假设您查看了 NSURLSession 文档并没有发现这个问题的文档。如果是这样,我将不胜感激您针对您查看的文档提交错误,要求其中包含有关此问题的信息。
后台会话仅支持上传和下载任务,不支持数据任务。并且只有数据任务使用缓存。所以后台会话没有理由检查缓存。
如果你想为下载做缓存,你必须自己显式地将响应添加到共享 URL 缓存中,并在启动后台任务之前检查它是否包含缓存的响应。
有关详细信息,请参阅NSURLCache
.