緩存篇

一、緩存策略

URL Loading System默認只支持如下5中協議:
(1) 、FTP協議(ftp://)
(2)、超文本傳輸協議(http://)
(3)、加密超文本傳輸協議(https://)
(4)、本地資源(file://)
(5)、數據URLs(data://)
其中只有http:// 和https:// 才有緩存策略.緩存策略詳細

//默認的緩存策略, 如果緩存不存在,直接從服務端獲取。如果緩存存在,會根據response中的Cache-Control字段判斷下一步操作,如: Cache-Control字段為must-revalidata, 則詢問服務端該數據是否有更新,無更新的話直接返回給用戶緩存數據,若已更新,則請求服務端.
1> NSURLRequestUseProtocolCachePolicy = 0
// 忽略本地緩存數據,直接請求服務端.
2> NSURLRequestReloadIgnoringLocalCacheData = 1
//忽略本地緩存,代理服務器以及其他中介,直接請求源服務端.
3> NSURLRequestIgnoringLocalAndRemoteCacheData = 4

4> NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData
//有緩存就使用,不管其有效性(即忽略Cache-Control字段), 無則請求服務端.
5> NSURLRequestReturnCacheDataElseLoad = 2
// 死活加載本地緩存. 沒有就失敗. (確定當前無網絡時使用)
6> NSURLRequestReturnCacheDataDontLoad = 3
//緩存數據必須得得到服務端確認有效才使用(貌似是NSURLRequestUseProtocolCachePolicy中的一種情況)
7> NSURLRequestReloadRevalidatingCacheData = 5

離線緩存

沒有WKWebview的事

NSURLCache

NSURLCache提供的是內存以及磁盤的綜合緩存機制,需要設置內存和磁盤存儲大小,默認為512kb的內存緩存空間,以及10MB的磁盤緩存空間。NSURLCache只會對GET請求進行緩存。

緩存原理:一個NSURLRequest對應一個NSCachedURLResponse
緩存技術:把緩存的數據都保存到數據庫中。

NSURLCache詳解和使用 主要http協議中請求與響應的內容判斷是否使用緩存

//響應頭
response = <NSHTTPURLResponse: 0x1700296c0> { URL: https://www.baidu.com/ } { status code: 200, headers {
  "Accept-Ranges" = bytes;  
"Cache-Control" = "max-age=0";  
Connection = "keep-alive";  
"Content-Length" = 114;  
"Content-Type" = "text/html";  
Date = "Wed, 03 Aug 2016 08:00:23 GMT";  
Etag = "\"579f13e2-72\"";  
Expires = "Wed, 03 Aug 2016 08:00:23 GMT";  
"Last-Modified" = "Mon, 01 Aug 2016 09:18:26 GMT";  
Server = nginx;  }

返回狀態碼 200與304
最后修改字段 Last-Modified/If-Modified-Sinc
資源的唯一標識符字段 Etag/If-None-Match
設置過期字段 Cache-Control

NSURLCache可以通過以上字段進行比對,來決定是否使用緩存,在有網情況下減少流量消耗。

NSURLProtocol

NSURLProtocol能夠讓你去重新定義蘋果的URL加載系統 (URL Loading System)的行為,URL Loading System里有許多類用于處理URL請求,比如NSURL,NSURLRequest,NSURLConnection和NSURLSession等,當URL Loading System使用NSURLRequest去獲取資源的時候,它會創建一個NSURLProtocol子類的實例,你不應該直接實例化一個NSURLProtocol,NSURLProtocol看起來像是一個協議,但其實這是一個類,而且必須使用該類的子類,并且需要被注冊。
(1)、攔截網絡請求(UIWebView),重定向網絡請求
(2)、忽略網絡請求,使用本地緩存
(3)、自定義網絡請求的返回結果
(4)、定義一些全局的網絡請求設置

NSURLProtocol可以通過攔截HTML加載中的所有請求(包括css,js,圖片),進行緩存。適合配合SDWebImage做HTML中圖片相關請求的緩存。

總結

![常用NSURLCache緩存機制][id]
[id]:http://upload-images.jianshu.io/upload_images/6036672-32ee636a91f6fb1f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240/to/image "Optional title attribute"

NSURLCache(監測更新及更新) + NSURLProtocol(攔截圖片請求) + SDWebimage(緩存圖片)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本文內容大多參考《圖解HTTP》一書 一. 認識代理服務器 所以講緩存為什么要先扯代理服務器?別急,讓我們看一下一...
    流光號船長閱讀 1,978評論 0 10
  • 概覽 緩存組件應該說是每個客戶端程序必備的核心組件,試想對于每個界面的訪問都必須重新請求勢必降低用戶體驗。但是如何...
    默默_David閱讀 1,967評論 1 9
  • 前言 在前端開發中,緩存有利于加快網頁的加載速度,同時緩存能夠被反復利用,所以可以減少流量和帶寬的開銷。 緩存的分...
    Layzimo閱讀 506評論 6 7
  • 我們在使用瀏覽器訪問互聯網資源時,想獲取指定的服務和信息。首先就要了解瀏覽器是如何定位到我們的站點的。輸入一個域名...
    roger_zhang閱讀 2,258評論 0 1
  • 張琦的事我也不想跟你解釋了,你說的就好像我在無中生有沒事找事,(你可以順嘴問問旁邊的人,一個女孩跟你這關系這事情正...
    Syria睿睿豬閱讀 129評論 0 0