一呼巷、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ī)制
由圖中可以看出捆昏,簡單流程如下:
- 如果請求的緩存響應(yīng)不存在赚楚,則URL加載系統(tǒng)直接從源端加載數(shù)據(jù);
- 否則骗卜,如果緩存響應(yīng)中沒有明確表示每次請求必須重新驗(yàn)證宠页,則如果不是響應(yīng)的緩存過期了,則URL加載系統(tǒng)會返回緩存數(shù)據(jù)
- 如果緩存的響應(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欧芽。