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 不起作用

NSURLCACHE

更改 NSURLCache 内存和磁盘容量不起作用

[NSURLCache cachedResponseForRequest:] 如何进行匹配?

无法使用超过 2GB 的 discCapacity 配置 NSURLCache

NSURLCache详解和使用