緩存機(jī)制的理解

<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];

}

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

推薦閱讀更多精彩內(nèi)容

  • 前幾天有朋友問到關(guān)于AFNetworking的緩存策略,當(dāng)時(shí)想了想,自己有一點(diǎn)的理解,但是不知道該如何回答,畢竟平...
    雪上踏痕閱讀 17,739評論 0 22
  • 一. 關(guān)于同一個(gè)url的多次請求 有時(shí)候,對同一個(gè)URL請求多次,返回的數(shù)據(jù)可能都是一樣的,比如服務(wù)器上的某張圖片...
    夢回藍(lán)橋閱讀 7,574評論 15 20
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,981評論 19 139
  • SDWebImage和AFNetworking的緩存機(jī)制 - 奔跑的人 - 博客頻道 - CSDN....
    fengguohui閱讀 4,541評論 0 6
  • 應(yīng)該是一片翠綠吧 我凝望過多次 在我搖拽的青春 模糊的行進(jìn)中 晃動(dòng)的影子下 它踩在鞋底 . 應(yīng)該忘不了吧 我憶了多...
    勿曉閱讀 269評論 0 2