仅URLSession缓存

时间:2018-11-21 09:13:02

标签: swift nsurlsession foundation

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

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

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

1 个答案:

答案 0 :(得分:0)

这是一个非常不寻常的请求。通常,您正在编写代码以在脱机模式下运行(在这种情况下,您想从缓存中拉出缓存结果是否仍然有效),或者在线(在这种情况下,如果要获取新数据,则要在这种情况下)无效)。

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

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

  • 使用NSURLRequestReturnCacheDataDontLoad并自己验证缓存响应的时间。
  • 在自定义会话中执行请求,使用NSURLRequestUseProtocolCachePolicy,然后在该会话中安装覆盖NSURLProtocolinitWithTask:cachedResponse:client:的自定义startLoading子类,并调用{{ 1}}放在其URLProtocol:didFailWithError:方法顶部的客户端上。

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