iOS中URL緩存策略-NSURLRequestCachePolicy

最近由于對(duì)NSURLRequestCachePolicy設(shè)置不當(dāng),導(dǎo)致了版本中出現(xiàn)一些bug昆烁,特此對(duì)NSURLRequestCachePolicy進(jìn)行了一些研究

NSURLRequestCachePolicy的定義如下

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

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

    NSURLRequestReturnCacheDataElseLoad = 2,
    NSURLRequestReturnCacheDataDontLoad = 3,

    NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
};
  • NSURLRequestUseProtocolCachePolicy
    默認(rèn)的緩存策略,其行為是由協(xié)議指定的針對(duì)該協(xié)議最好的實(shí)現(xiàn)方式犁享。關(guān)于該策略的介紹,篇后詳細(xì)說明。

  • NSURLRequestReloadIgnoringCacheData
    從服務(wù)端加載數(shù)據(jù)扇住,完全忽略緩存。

  • NSURLRequestReturnCacheDataElseLoad
    使用緩存數(shù)據(jù)霍骄,忽略其過期時(shí)間台囱;只有在沒有緩存版本的時(shí)候才從源端加載數(shù)據(jù)淡溯。

  • NSURLRequestReturnCacheDataDontLoad
    只使用cache數(shù)據(jù)读整,如果不存在cache,請(qǐng)求失斣廴ⅰ米间;用于沒有建立網(wǎng)絡(luò)連接離線模式

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

蘋果官方提供的決策樹如下:


NSURLRequestUseProtocolCachePolicy 對(duì)于HTTP和HTTPS的決策樹

由圖中可以看出强品,簡單流程如下:

  1. 如果請(qǐng)求的緩存響應(yīng)不存在,則URL加載系統(tǒng)直接從源端加載數(shù)據(jù)屈糊;
  2. 否則的榛,如果緩存響應(yīng)中沒有明確表示每次請(qǐng)求必須重新驗(yàn)證,則如果不是響應(yīng)的緩存過期了逻锐,則URL加載系統(tǒng)會(huì)返回緩存數(shù)據(jù)
  3. 如果緩存的響應(yīng)過期或者需要重新驗(yàn)證夫晌,URL加載系統(tǒng)發(fā)送HEAD請(qǐng)求到源端,查看資源是否發(fā)生了變化昧诱。如果變化了晓淀,則URL加載系統(tǒng)取出從始發(fā)源的數(shù)據(jù)。否則盏档,它返回緩存的響應(yīng)凶掰。
緩存的響應(yīng)過期或者需要重新驗(yàn)證說明

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

  • Cache-Control
    在第一次請(qǐng)求到服務(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 指示請(qǐng)求或響應(yīng)消息不能緩存
no-store 所有內(nèi)容都不會(huì)被緩存到緩存或 Internet 臨時(shí)文件中
must-revalidation 如果緩存的內(nèi)容失效稚配,請(qǐng)求必須發(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ā)請(qǐng)求),等同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í)資源的最后修改時(shí)間.
    If-Modified-Since 則由客戶端發(fā)送苇经,標(biāo)識(shí)客戶端所記錄的,資源的最后修改時(shí)間宦言。服務(wù)器接收到帶有該請(qǐng)求頭的請(qǐng)求時(shí)扇单,會(huì)使用該時(shí)間與資源的最后修改時(shí)間進(jìn)行對(duì)比,如果發(fā)現(xiàn)資源未被修改過奠旺,則直接返回HTTP 304而不返回包體蜘澜,告訴客戶端直接使用本地的緩存。否則響應(yīng)完整的消息內(nèi)容响疚。

  • Etag/If-None-Match
    Etag 由服務(wù)器發(fā)送鄙信,告之當(dāng)資源在服務(wù)器上的一個(gè)唯一標(biāo)識(shí)符。
    客戶端請(qǐng)求時(shí)忿晕,如果發(fā)現(xiàn)資源過期(使用Cache-Control的max-age)装诡,發(fā)現(xiàn)資源具有Etag聲明,這時(shí)請(qǐng)求服務(wù)器時(shí)則帶上If-None-Match頭,服務(wù)器收到后則與資源的標(biāo)識(shí)進(jìn)行對(duì)比鸦采,決定返回200或者304宾巍。

參考:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市渔伯,隨后出現(xiàn)的幾起案子顶霞,更是在濱河造成了極大的恐慌,老刑警劉巖锣吼,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件选浑,死亡現(xiàn)場離奇詭異,居然都是意外死亡玄叠,警方通過查閱死者的電腦和手機(jī)鲜侥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诸典,“玉大人描函,你說我怎么就攤上這事『唬” “怎么了舀寓?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肌蜻。 經(jīng)常有香客問我互墓,道長,這世上最難降的妖魔是什么蒋搜? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任篡撵,我火速辦了婚禮,結(jié)果婚禮上豆挽,老公的妹妹穿的比我還像新娘育谬。我一直安慰自己,他們只是感情好帮哈,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布膛檀。 她就那樣靜靜地躺著,像睡著了一般娘侍。 火紅的嫁衣襯著肌膚如雪咖刃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天憾筏,我揣著相機(jī)與錄音嚎杨,去河邊找鬼。 笑死氧腰,一個(gè)胖子當(dāng)著我的面吹牛枫浙,可吹牛的內(nèi)容都是我干的翠胰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼自脯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斤富?” 一聲冷哼從身側(cè)響起膏潮,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎满力,沒想到半個(gè)月后焕参,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡油额,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年叠纷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潦嘶。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涩嚣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掂僵,到底是詐尸還是另有隱情航厚,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布锰蓬,位于F島的核電站幔睬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏芹扭。R本人自食惡果不足惜麻顶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舱卡。 院中可真熱鬧辅肾,春花似錦、人聲如沸轮锥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽交胚。三九已至份汗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝴簇,已是汗流浹背杯活。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熬词,地道東北人旁钧。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓吸重,卻偏偏與公主長得像,于是被迫代替她去往敵國和親歪今。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嚎幸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 概覽 緩存組件應(yīng)該說是每個(gè)客戶端程序必備的核心組件,試想對(duì)于每個(gè)界面的訪問都必須重新請(qǐng)求勢必降低用戶體驗(yàn)寄猩。但是如何...
    默默_David閱讀 1,938評(píng)論 1 9
  • 本文內(nèi)容大多參考《圖解HTTP》一書 一. 認(rèn)識(shí)代理服務(wù)器 所以講緩存為什么要先扯代理服務(wù)器嫉晶?別急,讓我們看一下一...
    流光號(hào)船長閱讀 1,932評(píng)論 0 10
  • 轉(zhuǎn)載:瀏覽器緩存知識(shí)小結(jié)及應(yīng)用 閱讀目錄 1. 瀏覽器緩存基本認(rèn)識(shí) 2. 強(qiáng)緩存的原理 3. 強(qiáng)緩存的管理 4. ...
    meng_philip123閱讀 1,091評(píng)論 4 18
  • 1. 真正強(qiáng)大的女人拼職場能夠獨(dú)當(dāng)一面田篇,事業(yè)越做越大替废,心胸越來越寬。而看過了世界之大泊柬,自己那點(diǎn)小情小愛小悲小喜在浩...
    何舒卉閱讀 583評(píng)論 1 1
  • 愿你走出半生椎镣,歸來仍是少年。
    HaPPy灬閱讀 220評(píng)論 0 0