仅 URLSession 缓存

URLSession cache only

有时我只想在使用URLSession时从缓存中获取数据。例如,当在 UITableView 中快速滚动时,我想显示缓存中已有的图像,但不触发任何 HTTP 请求。图片只是一个例子,可以是任何东西。

所以我目前正在研究 URLSession 的 CachePolicy,但它不支持仅从缓存中获取有效(未过期等)数据的选项。

我可以自己查看 URLCache,但这当然也是 returns 可能已过期的数据。是否有一些 API 可以验证 CachedURLResponse?因为那时我可以自己做。还是我必须自己实施验证。

这是一个相当不寻常的请求。通常,您要么编写代码以在离线模式下运行(在这种情况下,无论缓存结果是否仍然有效,您都希望从缓存中提取数据),要么您在线(在这种情况下,您希望获取新数据,如果无效)。

如果您不触发网络请求,我会鼓励您认真考虑是否真的要强制执行缓存验证。

也就是说,如果您真的想要这种行为,有两种方法可以做到:

  • 使用 NSURLRequestReturnCacheDataDontLoad 并自行验证缓存响应的年龄。
  • 在自定义会话中执行请求,使用 NSURLRequestUseProtocolCachePolicy,并在该会话中安装覆盖 initWithTask:cachedResponse:client:startLoading 的自定义 NSURLProtocol 子类,然后调用URLProtocol:didFailWithError: 在其 startLoading 方法顶部提供的客户端上。

第二种方法可能是最佳选择,因为您不必担心了解缓存验证的所有深奥规则。通过使实际加载失败,缓存将正常工作,但一旦它真正开始发出网络请求,您的自定义协议就会阻止这种情况发生。因为您将仅在该特定会话中注册协议(通过会话配置中的 protocolClasses 数组),它不会中断其他会话中的网络。