iOS开发技术iOS开发问题总结shell

iOS中URL缓存策略-NSURLRequestCachePol

2016-08-16  本文已影响4688人  HK_Hank

最近由于对NSURLRequestCachePolicy设置不当,导致了版本中出现一些bug,特此对NSURLRequestCachePolicy进行了一些研究

NSURLRequestCachePolicy的定义如下

typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
    NSURLRequestUseProtocolCachePolicy = 0,

    NSURLRequestReloadIgnoringLocalCacheData = 1,
    NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented
    NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,

    NSURLRequestReturnCacheDataElseLoad = 2,
    NSURLRequestReturnCacheDataDontLoad = 3,

    NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
};
NSURLRequestUseProtocolCachePolicy实现机制

苹果官方提供的决策树如下:


NSURLRequestUseProtocolCachePolicy 对于HTTP和HTTPS的决策树

由图中可以看出,简单流程如下:

  1. 如果请求的缓存响应不存在,则URL加载系统直接从源端加载数据;
  2. 否则,如果缓存响应中没有明确表示每次请求必须重新验证,则如果不是响应的缓存过期了,则URL加载系统会返回缓存数据
  3. 如果缓存的响应过期或者需要重新验证,URL加载系统发送HEAD请求到源端,查看资源是否发生了变化。如果变化了,则URL加载系统取出从始发源的数据。否则,它返回缓存的响应。
缓存的响应过期或者需要重新验证说明

对于缓存的响应过期或者需要重新验证的情况,可以通过HTTP中请求和响应头来判断

常量 意义
public 指示响应可被任何缓存区缓存
private 内容只缓存到私有缓存中(仅客户端可以缓存)
no-cache 指示请求或响应消息不能缓存
no-store 所有内容都不会被缓存到缓存或 Internet 临时文件中
must-revalidation 如果缓存的内容失效,请求必须发送到服务器进行重新验证
max-age 可以接收生存期不大于指定时间(以秒为单位)的响应
min-fresh 可以接收响应时间小于当前时间加上指定时间的响应
max-stale 可以接收超出超时期间的响应消息
参考:
上一篇下一篇

猜你喜欢

热点阅读