iOS中URL緩存策略-NSURLRequestCachePolicy

最近由于對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
    默認的緩存策略,其行為是由協議指定的針對該協議最好的實現方式。關于該策略的介紹,篇后詳細說明。

  • NSURLRequestReloadIgnoringCacheData
    從服務端加載數據,完全忽略緩存。

  • NSURLRequestReturnCacheDataElseLoad
    使用緩存數據,忽略其過期時間;只有在沒有緩存版本的時候才從源端加載數據。

  • NSURLRequestReturnCacheDataDontLoad
    只使用cache數據,如果不存在cache,請求失敗;用于沒有建立網絡連接離線模式

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閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容

  • 概覽 緩存組件應該說是每個客戶端程序必備的核心組件,試想對于每個界面的訪問都必須重新請求勢必降低用戶體驗。但是如何...
    默默_David閱讀 1,953評論 1 9
  • 本文內容大多參考《圖解HTTP》一書 一. 認識代理服務器 所以講緩存為什么要先扯代理服務器?別急,讓我們看一下一...
    流光號船長閱讀 1,952評論 0 10
  • 轉載:瀏覽器緩存知識小結及應用 閱讀目錄 1. 瀏覽器緩存基本認識 2. 強緩存的原理 3. 強緩存的管理 4. ...
    meng_philip123閱讀 1,097評論 4 18
  • 1. 真正強大的女人拼職場能夠獨當一面,事業越做越大,心胸越來越寬。而看過了世界之大,自己那點小情小愛小悲小喜在浩...
    何舒卉閱讀 587評論 1 1
  • 愿你走出半生,歸來仍是少年。
    HaPPy灬閱讀 249評論 0 0