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加載請求褂微,請使用協(xié)議實(shí)現(xiàn)中定義的緩存邏輯(如果有)盏浇。

默認(rèn)的緩存策略滑绒, 如果緩存不存在佑稠,直接從服務(wù)端獲取粗卜。如果緩存存在晤揣,會根據(jù)response中的Cache-Control字段判斷下一步操作桥爽,如: Cache-Control字段為must-revalidata, 則詢問服務(wù)端該數(shù)據(jù)是否有更新,無更新的話直接返回給用戶緩存數(shù)據(jù)昧识,若已更新钠四,則請求服務(wù)端.

2: NSURLRequestReloadIgnoringLocalCacheData = 1,

The URL load should be loaded only from the originating source.
應(yīng)僅從原始源加載URL加載。

忽略本地緩存數(shù)據(jù)跪楞,直接請求服務(wù)端.

3: NSURLRequestIgnoringLocalAndRemoteCacheData = 4,

Ignore local cache data, and instruct proxies and other intermediates to disregard their caches so far as the protocol allows.
忽略本地緩存數(shù)據(jù)缀去,并指示代理和其他中間人在協(xié)議允許的情況下忽略其緩存。

忽略本地緩存甸祭,代理服務(wù)器以及其他中介缕碎,直接請求源服務(wù)端.

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.
使用現(xiàn)有緩存數(shù)據(jù)池户,無論是年齡還是有效期咏雌,只有在沒有緩存數(shù)據(jù)時(shí)才從原始源加載。

有緩存就使用校焦,不管其有效性(即忽略Cache-Control字段), 無則請求服務(wù)端.

6: NSURLRequestReturnCacheDataDontLoad = 3,

Use existing cache data, regardless or age or expiration date, and fail if no cached data is available.
使用現(xiàn)有緩存數(shù)據(jù)赊抖,無論是年齡或過期日期,如果沒有可用的緩存數(shù)據(jù)寨典,則會失敗氛雪。

死活加載本地緩存. 沒有就失敗. (確定當(dāng)前無網(wǎng)絡(luò)時(shí)使用)

7: NSURLRequestReloadRevalidatingCacheData = 5,

Use cache data if it can be validated by the origin source; otherwise, load from the origin.
如果原始源可以驗(yàn)證緩存數(shù)據(jù),請使用緩存數(shù)據(jù); 否則耸成,從原點(diǎn)加載报亩。

緩存數(shù)據(jù)必須得得到服務(wù)端確認(rèn)有效才使用(貌似是NSURLRequestUseProtocolCachePolicy中的一種情況)

二浴鸿、Tips:

URL Loading System默認(rèn)只支持如下5中協(xié)議:
其中只有http://和https://才有緩存策略.
(1) http://
(2) https://
(3) ftp://
(4) file://
(5) data://

三、官網(wǎng)默認(rèn)緩存策略

NSURLRequestUseProtocolCachePolicy實(shí)現(xiàn)機(jī)制


NSURLRequestUseProtocolCachePolicy 對于HTTP和HTTPS的決策樹

由圖中可以看出捆昏,簡單流程如下:

  1. 如果請求的緩存響應(yīng)不存在赚楚,則URL加載系統(tǒng)直接從源端加載數(shù)據(jù);
  2. 否則骗卜,如果緩存響應(yīng)中沒有明確表示每次請求必須重新驗(yàn)證宠页,則如果不是響應(yīng)的緩存過期了,則URL加載系統(tǒng)會返回緩存數(shù)據(jù)
  3. 如果緩存的響應(yīng)過期或者需要重新驗(yàn)證寇仓,URL加載系統(tǒng)發(fā)送HEAD請求到源端举户,查看資源是否發(fā)生了變化。如果變化了遍烦,則URL加載系統(tǒng)取出從始發(fā)源的數(shù)據(jù)俭嘁。否則,它返回緩存的響應(yīng)服猪。
緩存的響應(yīng)過期或者需要重新驗(yàn)證說明

對于緩存的響應(yīng)過期或者需要重新驗(yàn)證的情況供填,可以通過HTTP中請求和響應(yīng)頭來判斷

  • Cache-Control
    在第一次請求到服務(wù)器資源的時(shí)候,服務(wù)器需要使用Cache-Control這個(gè)響應(yīng)頭來指定緩存策略罢猪,它的格式如下:Cache-Control:max-age=xxxx近她,這個(gè)頭指指明緩存過期的時(shí)間
    Cache-Control頭具有如下選項(xiàng):
常量 意義
public 指示響應(yīng)可被任何緩存區(qū)緩存
private 內(nèi)容只緩存到私有緩存中(僅客戶端可以緩存)
no-cache 指示請求或響應(yīng)消息不能緩存
no-store 所有內(nèi)容都不會被緩存到緩存或 Internet 臨時(shí)文件中
must-revalidation 如果緩存的內(nèi)容失效,請求必須發(fā)送到服務(wù)器進(jìn)行重新驗(yàn)證
max-age 可以接收生存期不大于指定時(shí)間(以秒為單位)的響應(yīng)
min-fresh 可以接收響應(yīng)時(shí)間小于當(dāng)前時(shí)間加上指定時(shí)間的響應(yīng)
max-stale 可以接收超出超時(shí)期間的響應(yīng)消息
  • Expires
    Expires表示存在時(shí)間膳帕,允許客戶端在這個(gè)時(shí)間之前不去檢查(發(fā)請求)粘捎,等同max-age的效果。但是如果同時(shí)存在危彩,則被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是由服務(wù)器返回響應(yīng)頭,標(biāo)識資源的最后修改時(shí)間.
    If-Modified-Since 則由客戶端發(fā)送汤徽,標(biāo)識客戶端所記錄的娩缰,資源的最后修改時(shí)間。服務(wù)器接收到帶有該請求頭的請求時(shí)谒府,會使用該時(shí)間與資源的最后修改時(shí)間進(jìn)行對比漆羔,如果發(fā)現(xiàn)資源未被修改過,則直接返回HTTP 304而不返回包體狱掂,告訴客戶端直接使用本地的緩存。否則響應(yīng)完整的消息內(nèi)容亲轨。

  • Etag/If-None-Match
    Etag 由服務(wù)器發(fā)送趋惨,告之當(dāng)資源在服務(wù)器上的一個(gè)唯一標(biāo)識符。
    客戶端請求時(shí)惦蚊,如果發(fā)現(xiàn)資源過期(使用Cache-Control的max-age)器虾,發(fā)現(xiàn)資源具有Etag聲明讯嫂,這時(shí)請求服務(wù)器時(shí)則帶上If-None-Match頭,服務(wù)器收到后則與資源的標(biāo)識進(jìn)行對比兆沙,決定返回200或者304欧芽。

參考:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市葛圃,隨后出現(xiàn)的幾起案子千扔,更是在濱河造成了極大的恐慌,老刑警劉巖库正,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曲楚,死亡現(xiàn)場離奇詭異,居然都是意外死亡褥符,警方通過查閱死者的電腦和手機(jī)龙誊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喷楣,“玉大人趟大,你說我怎么就攤上這事∠澈福” “怎么了逊朽?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粗截。 經(jīng)常有香客問我惋耙,道長,這世上最難降的妖魔是什么熊昌? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任绽榛,我火速辦了婚禮,結(jié)果婚禮上婿屹,老公的妹妹穿的比我還像新娘灭美。我一直安慰自己,他們只是感情好昂利,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布届腐。 她就那樣靜靜地躺著,像睡著了一般蜂奸。 火紅的嫁衣襯著肌膚如雪犁苏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天扩所,我揣著相機(jī)與錄音围详,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛助赞,可吹牛的內(nèi)容都是我干的买羞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼雹食,長吁一口氣:“原來是場噩夢啊……” “哼畜普!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起群叶,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤吃挑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后盖呼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儒鹿,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年几晤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了约炎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蟹瘾,死狀恐怖圾浅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情憾朴,我是刑警寧澤狸捕,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站众雷,受9級特大地震影響灸拍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砾省,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一鸡岗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧编兄,春花似錦轩性、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至件舵,卻和暖如春卸察,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铅祸。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工蛾派, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓洪乍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夜焦。 傳聞我的和親對象是個(gè)殘疾皇子壳澳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容