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