一、緩存策略
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(緩存圖片)