緩存策略大致分為兩種:按需緩存和預(yù)緩存扰肌。
按需緩存是指把從服務(wù)器獲取的內(nèi)容已某種格式放在本地的文件系統(tǒng)柬帕,之后對(duì)于每次請(qǐng)求挣磨,檢查緩存中時(shí)候存在這塊數(shù)據(jù)杂曲,只有當(dāng)數(shù)據(jù)不存在(或過期)的情況才從服務(wù)器獲取芝发。這樣的話霞掺,緩存層就和處理器的高速緩存差不多秘蛇。獲取數(shù)據(jù)的速度比數(shù)據(jù)本身重要备燃。按需緩存的工作原理類似于瀏覽器緩存柒爵,它允許我們查看以前產(chǎn)看或者訪問過的內(nèi)容。按需緩存可以通過在打開一個(gè)viewcontroller是按需地緩存數(shù)據(jù)模型來實(shí)現(xiàn)赚爵,而不是在一個(gè)后臺(tái)線程上做這件事,已可以在一個(gè)URL請(qǐng)求返回成功應(yīng)答時(shí)實(shí)現(xiàn)按需緩存法瑟。
預(yù)緩存是指把內(nèi)容放在本地以備將來訪問冀膝,對(duì)預(yù)緩存來說,數(shù)據(jù)丟失或不命中是不可接受的霎挟,比如說用戶下載了文章準(zhǔn)備在地鐵上看窝剖,卻發(fā)現(xiàn)設(shè)備商不存在這些文章。ps:實(shí)現(xiàn)預(yù)緩存可能需要一個(gè)后臺(tái)線程訪問數(shù)據(jù)并以有意義的格式保存酥夭,以便本地緩存無需重新連接服務(wù)器即可編輯赐纱。
存儲(chǔ)緩存
因?yàn)榫彺鏀?shù)據(jù)不是由用戶產(chǎn)生的,所以緩存數(shù)據(jù)應(yīng)該保存在NSCachesDirectory熬北,而不是NSDocumentsDirectory疙描。以下代碼在Library/caches文件夾下創(chuàng)建名為MyAppCache的目錄。
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
NSString*cachesDirectory = [pathsfirstObject];
cachesDirectory = [cachesDirectorystringByAppendingPathComponent:@"MyAppCache"];
1.實(shí)現(xiàn)數(shù)據(jù)模型緩存
可以用NSKeyedArchiver類來實(shí)現(xiàn)數(shù)據(jù)緩存模型讶隐,前提是模型類遵循NSCoding協(xié)議起胰。
當(dāng)模型遵循NSCoding協(xié)議時(shí),只要調(diào)用以下其中的一個(gè)方法即可歸檔對(duì)象
[NSKeyedArchiver archiveRootObject:<#(nonnull id)#> toFile:<#(nonnull NSString *)#>];
[NSKeyedArchiver archivedDataWithRootObject:<#(nonnull id)#>];
第一個(gè)方法在archiveFilePath指定的路徑下創(chuàng)建一個(gè)歸檔文件巫延。第二個(gè)方法返回一個(gè)NSData對(duì)象效五。NSData通常更快,因?yàn)闆]有文件訪問開銷炉峰,但對(duì)象保存在應(yīng)用的內(nèi)存中畏妖,如果不定期檢查的話會(huì)很快用完內(nèi)存。
NSKeyedUnarchiver類用于從文件(或者NSData指針)反歸檔模型疼阔。根據(jù)反歸檔的位置戒劫,選擇使用下面兩個(gè)類方法半夷。
[NSKeyedUnarchiver unarchiveObjectWithData:data];
[NSKeyedUnarchiver unarchiveObjectWithFile:archiveFilePath];
接下來我們著重關(guān)注按需緩存的實(shí)現(xiàn)。
按需緩存是從視圖從視圖層次結(jié)構(gòu)中消失的時(shí)候做的谱仪,從技術(shù)上講是viewwillappear:方法中
以下是實(shí)現(xiàn)按需緩存的viewcontroller的控制流
自定義一個(gè)Person類玻熙,并實(shí)現(xiàn)NSCoding協(xié)議
接下來,我們需要新建AppCache類來管理緩存疯攒。
2.緩存的版本控制
使緩存失效:首先把應(yīng)用的當(dāng)前版本保存在NSUserDefault嗦随,每次應(yīng)用啟動(dòng)時(shí)都要檢查之前保存的版本號(hào)是否為應(yīng)用當(dāng)前版本。如果比當(dāng)前版本舊敬尺,把緩存文件夾刪除并把新版本號(hào)保存在UserDefaults中枚尼。
緩存失效和版本控制問題從viewcontroller中抽象出來,接下來我們?yōu)锳ppCache創(chuàng)建內(nèi)存緩存砂吞。
3.內(nèi)存緩存
接下來將介紹如何給AppCache類添加一層透明的署恍,位于內(nèi)存中的緩存,并且設(shè)計(jì)一個(gè)LRU(Least Recently Used)算法吧緩存的數(shù)據(jù)保存到磁盤蜻直。
以下簡(jiǎn)單地列出創(chuàng)建內(nèi)存緩存的步驟盯质。
(1)添加變量來存放內(nèi)存緩存數(shù)據(jù)
(2)限制內(nèi)存緩存大小,并且把最近最少使用的項(xiàng)寫入文件概而。
(3)處理內(nèi)存警告呼巷,并把內(nèi)存緩存以文件形式寫入閃存。
(4)當(dāng)應(yīng)用關(guān)閉赎瑰、退出王悍、進(jìn)入后臺(tái),把內(nèi)存緩存全部以文件形式寫入閃存餐曼。
3.1為AppCache設(shè)計(jì)內(nèi)存緩存
AppCache中的變量
將模型對(duì)象透明地保存到內(nèi)存緩存中压储。
上面的代碼調(diào)用了一個(gè)輔助方法,cacheData:toFile:源譬,而不是直接寫入文件集惋。這個(gè)方法會(huì)把從NSKeyedArchiver得到的NSData保存到內(nèi)存緩存中。當(dāng)內(nèi)存緩存達(dá)到預(yù)定的內(nèi)存限制時(shí)踩娘,它會(huì)檢查并刪除最近最少使用的數(shù)據(jù)芋膘,然后把數(shù)據(jù)保存到文件中。
類似于之前調(diào)用cacheData:toFile:緩存數(shù)據(jù)的代碼霸饲,在下面的代碼中为朋,我們需要寫一個(gè)檢查內(nèi)存緩存并返回?cái)?shù)據(jù)的方法,而不是直接從文件中讀取厚脉。只有當(dāng)內(nèi)存緩存不存在所需數(shù)據(jù)時(shí)习寸,該方法才訪問文件。
3.2處理內(nèi)存警告
在靜態(tài)初始化方法中傻工,向通知中心添加觀察者霞溪。
然后寫一個(gè)方法來把內(nèi)存中的項(xiàng)保存到文件:
3.3處理結(jié)束和進(jìn)入后臺(tái)通知
最后啰嗦一句孵滞,記得在dealloc移除觀察者!
寫完收工Q炱ァ7蝗摹!
寫在最后
本篇博文是本人的處女作殴蓬,再加上本人才疏學(xué)淺匿级,難免會(huì)有錯(cuò)漏之處。如果大家能發(fā)現(xiàn)其中的問題染厅,歡迎大家指出痘绎。(第一次用簡(jiǎn)書不太會(huì),上篇文章只發(fā)布了一半肖粮。孤页。。)