NSURLCache 用于 NSURLSession 后台任务
Posted
技术标签:
【中文标题】NSURLCache 用于 NSURLSession 后台任务【英文标题】:NSURLCache for NSURLSession background tasks 【发布时间】:2016-02-16 13:22:06 【问题描述】:我正在尝试在我的应用程序中实现缓存,我正在使用具有后台配置的 NSURLSession 来满足我的大部分网络需求,它工作得很好,但是我添加了一个缓存对象,会话忽略它并总是转到服务器
我尝试使用带缓存的默认会话实例,系统使用缓存
我之前已经多次阅读文档,但没有提到忽略后台任务的缓存对象
有谁知道是bug还是什么
【问题讨论】:
【参考方案1】:后台会话仅支持上传和下载任务,不支持数据任务。 只有数据任务使用缓存。所以后台会话没有理由检查缓存。
如果您想缓存下载,您必须自己显式地将响应添加到共享 URL 缓存中,并在启动后台任务之前检查它是否包含缓存的响应。
有关详细信息,请参阅NSURLCache
的文档。
【讨论】:
【参考方案2】:哇,我很久以前就问过这个问题了,仍然没有答案。
说实话,我最终使用了 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 文档并没有发现这个问题的文档。如果是这样,我们将不胜感激您针对您查看的文档提交错误,要求其中包含有关此问题的信息。
【讨论】:
以上是关于NSURLCache 用于 NSURLSession 后台任务的主要内容,如果未能解决你的问题,请参考以下文章
[NSURLCache cachedResponseForRequest:] 如何进行匹配?