NSURLRequestCachePolicy 缓存策略

一、NSURLRequestCachePolicy 缓存策略

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

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

    NSURLRequestReturnCacheDataElseLoad = 2,
    NSURLRequestReturnCacheDataDontLoad = 3,

    NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
};

1: NSURLRequestUseProtocolCachePolicy = 0,

Use the caching logic defined in the protocol implementation, if any, for a particular URL load request.
对于特定的URL加载请求,请使用协议实现中定义的缓存逻辑(如果有)。

默认的缓存策略, 如果缓存不存在,直接从服务端获取。如果缓存存在,会根据response中的Cache-Control字段判断下一步操作,如: Cache-Control字段为must-revalidata, 则询问服务端该数据是否有更新,无更新的话直接返回给用户缓存数据,若已更新,则请求服务端.

2: NSURLRequestReloadIgnoringLocalCacheData = 1,

The URL load should be loaded only from the originating source.
应仅从原始源加载URL加载。

忽略本地缓存数据,直接请求服务端.

3: NSURLRequestIgnoringLocalAndRemoteCacheData = 4,

Ignore local cache data, and instruct proxies and other intermediates to disregard their caches so far as the protocol allows.
忽略本地缓存数据,并指示代理和其他中间人在协议允许的情况下忽略其缓存。

忽略本地缓存,代理服务器以及其他中介,直接请求源服务端.

4: NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData

Replaced by NSURLRequestReloadIgnoringLocalCacheData.
由NSURLRequestReloadIgnoringLocalCacheData替换。

NSURLRequestReloadIgnoringLocalCacheData的替换方案.

5: NSURLRequestReturnCacheDataElseLoad = 2,

Use existing cache data, regardless or age or expiration date, loading from originating source only if there is no cached data.
使用现有缓存数据,无论是年龄还是有效期,只有在没有缓存数据时才从原始源加载。

有缓存就使用,不管其有效性(即忽略Cache-Control字段), 无则请求服务端.

6: NSURLRequestReturnCacheDataDontLoad = 3,

Use existing cache data, regardless or age or expiration date, and fail if no cached data is available.
使用现有缓存数据,无论是年龄或过期日期,如果没有可用的缓存数据,则会失败。

死活加载本地缓存. 没有就失败. (确定当前无网络时使用)

7: NSURLRequestReloadRevalidatingCacheData = 5,

Use cache data if it can be validated by the origin source; otherwise, load from the origin.
如果原始源可以验证缓存数据,请使用缓存数据; 否则,从原点加载。

缓存数据必须得得到服务端确认有效才使用(貌似是NSURLRequestUseProtocolCachePolicy中的一种情况)

二、Tips:

URL Loading System默认只支持如下5中协议:
其中只有http://和https://才有缓存策略.
(1) http://
(2) https://
(3) ftp://
(4) file://
(5) data://

三、官网默认缓存策略

NSURLRequestUseProtocolCachePolicy实现机制


NSURLRequestUseProtocolCachePolicy 对于HTTP和HTTPS的决策树

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

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

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

  • Cache-Control
    在第一次请求到服务器资源的时候,服务器需要使用Cache-Control这个响应头来指定缓存策略,它的格式如下:Cache-Control:max-age=xxxx,这个头指指明缓存过期的时间
    Cache-Control头具有如下选项:
常量 意义
public 指示响应可被任何缓存区缓存
private 内容只缓存到私有缓存中(仅客户端可以缓存)
no-cache 指示请求或响应消息不能缓存
no-store 所有内容都不会被缓存到缓存或 Internet 临时文件中
must-revalidation 如果缓存的内容失效,请求必须发送到服务器进行重新验证
max-age 可以接收生存期不大于指定时间(以秒为单位)的响应
min-fresh 可以接收响应时间小于当前时间加上指定时间的响应
max-stale 可以接收超出超时期间的响应消息
  • Expires
    Expires表示存在时间,允许客户端在这个时间之前不去检查(发请求),等同max-age的效果。但是如果同时存在,则被Cache-Control的max-age覆盖。
    格式:Expires = "Expires" ":" HTTP-date"
    例如:Expires: Thu, 01 Dec 1994 16:00:00 GMT (必须是GMT格式)

  • Last-Modified/If-Modified-Since
    Last-Modified是由服务器返回响应头,标识资源的最后修改时间.
    If-Modified-Since 则由客户端发送,标识客户端所记录的,资源的最后修改时间。服务器接收到带有该请求头的请求时,会使用该时间与资源的最后修改时间进行对比,如果发现资源未被修改过,则直接返回HTTP 304而不返回包体,告诉客户端直接使用本地的缓存。否则响应完整的消息内容。

  • Etag/If-None-Match
    Etag 由服务器发送,告之当资源在服务器上的一个唯一标识符。
    客户端请求时,如果发现资源过期(使用Cache-Control的max-age),发现资源具有Etag声明,这时请求服务器时则带上If-None-Match头,服务器收到后则与资源的标识进行对比,决定返回200或者304。

参考:
最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容