仅 URLSession 缓存
URLSession cache only
有时我只想在使用URLSession时从缓存中获取数据。例如,当在 UITableView 中快速滚动时,我想显示缓存中已有的图像,但不触发任何 HTTP 请求。图片只是一个例子,可以是任何东西。
所以我目前正在研究 URLSession 的 CachePolicy,但它不支持仅从缓存中获取有效(未过期等)数据的选项。
我可以自己查看 URLCache,但这当然也是 returns 可能已过期的数据。是否有一些 API 可以验证 CachedURLResponse?因为那时我可以自己做。还是我必须自己实施验证。
这是一个相当不寻常的请求。通常,您要么编写代码以在离线模式下运行(在这种情况下,无论缓存结果是否仍然有效,您都希望从缓存中提取数据),要么您在线(在这种情况下,您希望获取新数据,如果无效)。
如果您不触发网络请求,我会鼓励您认真考虑是否真的要强制执行缓存验证。
也就是说,如果您真的想要这种行为,有两种方法可以做到:
- 使用
NSURLRequestReturnCacheDataDontLoad
并自行验证缓存响应的年龄。
- 在自定义会话中执行请求,使用
NSURLRequestUseProtocolCachePolicy
,并在该会话中安装覆盖 initWithTask:cachedResponse:client:
和 startLoading
的自定义 NSURLProtocol
子类,然后调用URLProtocol:didFailWithError:
在其 startLoading
方法顶部提供的客户端上。
第二种方法可能是最佳选择,因为您不必担心了解缓存验证的所有深奥规则。通过使实际加载失败,缓存将正常工作,但一旦它真正开始发出网络请求,您的自定义协议就会阻止这种情况发生。因为您将仅在该特定会话中注册协议(通过会话配置中的 protocolClasses
数组),它不会中断其他会话中的网络。
有时我只想在使用URLSession时从缓存中获取数据。例如,当在 UITableView 中快速滚动时,我想显示缓存中已有的图像,但不触发任何 HTTP 请求。图片只是一个例子,可以是任何东西。
所以我目前正在研究 URLSession 的 CachePolicy,但它不支持仅从缓存中获取有效(未过期等)数据的选项。
我可以自己查看 URLCache,但这当然也是 returns 可能已过期的数据。是否有一些 API 可以验证 CachedURLResponse?因为那时我可以自己做。还是我必须自己实施验证。
这是一个相当不寻常的请求。通常,您要么编写代码以在离线模式下运行(在这种情况下,无论缓存结果是否仍然有效,您都希望从缓存中提取数据),要么您在线(在这种情况下,您希望获取新数据,如果无效)。
如果您不触发网络请求,我会鼓励您认真考虑是否真的要强制执行缓存验证。
也就是说,如果您真的想要这种行为,有两种方法可以做到:
- 使用
NSURLRequestReturnCacheDataDontLoad
并自行验证缓存响应的年龄。 - 在自定义会话中执行请求,使用
NSURLRequestUseProtocolCachePolicy
,并在该会话中安装覆盖initWithTask:cachedResponse:client:
和startLoading
的自定义NSURLProtocol
子类,然后调用URLProtocol:didFailWithError:
在其startLoading
方法顶部提供的客户端上。
第二种方法可能是最佳选择,因为您不必担心了解缓存验证的所有深奥规则。通过使实际加载失败,缓存将正常工作,但一旦它真正开始发出网络请求,您的自定义协议就会阻止这种情况发生。因为您将仅在该特定会话中注册协议(通过会话配置中的 protocolClasses
数组),它不会中断其他会话中的网络。