<1>為什么要要用緩存機(jī)制
目的:提高程序的響應(yīng)速度,避免流量浪費(fèi)(內(nèi)存緩存、磁盤緩存)
內(nèi)存緩存其實(shí)就是沙盒緩存
<2>緩存在客戶端和服務(wù)器通信的過程
(2-1)客戶端第一次向服務(wù)器請求數(shù)據(jù):
第一次請求數(shù)據(jù)數(shù)據(jù)時(shí),檢測內(nèi)存緩存中是否有數(shù)據(jù),如果內(nèi)存緩存中沒有數(shù)據(jù),就判斷硬盤緩存中是否有數(shù)據(jù),如果硬盤緩存都沒有數(shù)據(jù),就去服務(wù)器里請求數(shù)據(jù)。
服務(wù)器第一次給客戶端返回?cái)?shù)據(jù):
服務(wù)器第一次返回給客戶端數(shù)據(jù)時(shí),數(shù)據(jù)是保存在內(nèi)存緩存中,其次解析和展示在控制器上,最后將服務(wù)器的數(shù)據(jù)緩存到硬盤上(沙盒)。
(2-2)客戶端再次向服務(wù)器請求數(shù)據(jù)時(shí):
(1)如果程序沒有關(guān)閉,一直在運(yùn)行過程中。此時(shí),內(nèi)存緩存和硬盤緩存都有數(shù)據(jù)。
所以,此時(shí)只要在內(nèi)存緩存中取出數(shù)據(jù)展示到控制器上就行。
(2)如果程序重新啟動(dòng),內(nèi)存緩存就消失了,里面不存在緩存數(shù)據(jù)。慶幸硬盤緩存中數(shù)據(jù)還存在。一旦從硬盤緩存中讀取數(shù)據(jù),內(nèi)存緩存就重新生成數(shù)據(jù),客戶端可以從內(nèi)存緩存中讀取數(shù)據(jù)了。
<3>緩存的實(shí)現(xiàn)
(1)是對GET請求還是POST請求進(jìn)行緩存?
答:一般是對GET請求進(jìn)行緩存。
在IOS中,一般用NSURLCache來進(jìn)行緩存數(shù)據(jù)。在ios5之前,只支持內(nèi)存緩存。在IOS5之后,支持內(nèi)存緩存和硬盤緩存。
緩存的原理:根據(jù)一個(gè)NSURLRequest緩存一個(gè)NSCacheURLResponse
緩存的技術(shù):利用了數(shù)據(jù)庫。在開發(fā)中可以查看沙盒中的/Library/Caches,可以看到緩存以XXX.db格式保存在本地。
<4>緩存策略的理解
(緩存策略是枚舉型的,ios提供7種緩存策略模式,但實(shí)際上有用的只有4中)
緩存策略模式:
NSURLRequestUseProtocolCachePolicy= 0,//使用協(xié)議的緩存策略,意思說依賴于HTTP協(xié)議的,如果HTTP協(xié)議沒有專門去設(shè)置緩存鍵值對,這種方式默認(rèn)是沒有緩存的
NSURLRequestReloadIgnoringLocalCacheData= 1,//字面意思忽略本地緩存,不使用緩存,直接發(fā)送請求
NSURLRequestReloadIgnoringLocalAndRemoteCacheData= 4, // Unimplemented,表示蘋果暫時(shí)沒有實(shí)現(xiàn)此技術(shù)
NSURLRequestReloadIgnoringCacheData= NSURLRequestReloadIgnoringLocalCacheData,//這種緩存策略跟NSURLRequestReloadIgnoringLocalCacheData一樣,忽略本地緩存,直接發(fā)送請求。
NSURLRequestReturnCacheDataElseLoad= 2,//有緩存就返回緩存數(shù)據(jù),沒有緩存就加載緩存數(shù)據(jù)。
NSURLRequestReturnCacheDataDontLoad= 3,//有緩存就返回緩存數(shù)據(jù),沒有緩存就不請求網(wǎng)絡(luò)數(shù)據(jù),當(dāng)做請求錯(cuò)誤處理,常用于離線模式。
NSURLRequestReloadRevalidatingCacheData= 5, // Unimplemented,表示蘋果暫時(shí)沒有實(shí)現(xiàn)此技術(shù)
<5>IOS常用的緩存對象方法:
(1)獲取到全局緩存對象
NSURLCache*cache = [NSURLCache sharedURLCache];
(2)拿到全局內(nèi)存緩存的用處:可以設(shè)置內(nèi)存緩存的最大容量(字節(jié)為單位,默認(rèn)是512KB)
[cache setMemoryCapacity:XXX];
(3)設(shè)置硬盤緩存的最大容量(字節(jié)為單位,默認(rèn)是10M)
[cache setDiskCapacity:XXX];
硬盤緩存的位置: 沙盒/Library/Caches
(4)獲取某個(gè)請求的緩存
NSCachedURLResponse *response =[cachecachedResponseForRequest:url];
if (response) {
MyLog(@"說明這個(gè)請求有緩存");
}else{
MyLog(@"說明這個(gè)請求沒有有緩存");
}
(5)清除某個(gè)請求的緩存[cache removeCachedResponseForRequest:request];
(6)清除所有請求的緩存[cache removeAllCachedResponses];
<6>使用緩存注意事項(xiàng):
(1)經(jīng)常更新的數(shù)據(jù)如:不能用緩存
(2)永久不會(huì)變的數(shù)據(jù):可以使用緩存
(3)偶爾會(huì)更新的數(shù)據(jù):可以定期更改緩存策略或者清除緩存
//方案一(更改緩存策略)
if(緩存時(shí)間少于7天){
//設(shè)置緩存策略
request.cachePolicy =NSURLRequestReturnCacheDataElseLoad;
}
//方案二(清除緩存)
if(緩存時(shí)間大于7天){
//清除某個(gè)請求的緩存
[cacheremoveCachedResponseForRequest:request];
}