iOS - TABAnimated骨架屏緩存策略

前言

使用TABAnimated集成骨架屏的開發(fā)者,大概都知道其原理是基于原視圖映射生成骨架層,在細(xì)節(jié)上不滿意的地方可以通過預(yù)處理回調(diào)進(jìn)行異步調(diào)整。

  • 本文內(nèi)容:TABAnimated的緩存策略
  • 使用TABAnimated的開發(fā)者,此文檔建議閱讀

TABAnimated緩存的是什么?

緩存的是通過映射機(jī)制生成的骨架屏單元管理對(duì)象TABComponentManager,
對(duì)該對(duì)象使用一個(gè)plist文件來解釋。同時(shí),通過計(jì)數(shù)的方式,逐漸篩選出該用戶經(jīng)常加載的骨架屏,提高緩存命中率。

TABAnimated緩存功能有什么作用?

  • 相同版本的代碼,避開了重復(fù)使用映射機(jī)制
  • 避開了映射采用的遞歸操作,降低了CPU峰值,提高系統(tǒng)性能
  • 省去部分場景的視圖預(yù)填充成本及其他耗時(shí)操作,穩(wěn)定性得到有效提升
  • 預(yù)處理回調(diào)需要重新調(diào)整CALayer的部分值,有效降低GPU繪制成本

性能評(píng)測(cè)

  • 評(píng)測(cè)工具:Instruments
  • 評(píng)測(cè)環(huán)境:單線程
  • 評(píng)測(cè)機(jī)型:iPhone 6s
image

分析

其實(shí),從峰值數(shù)據(jù)來看,GPU、CPU的數(shù)值本身并不高,緩存功能也并沒有將他們的峰值降低很多,但是我為什么還要引入緩存策略呢?

答:

  1. 緩存策略更多地是優(yōu)化了映射機(jī)制的耗時(shí)。對(duì)于CPU性能不高的設(shè)備,在極端的情況下,不能在下一次Vsyc信號(hào)來臨時(shí),將骨架屏的數(shù)據(jù)計(jì)算好并交給GPU處理,此時(shí)造成掉幀情況。

當(dāng)然,掉幀是非常極端的情況。
例如:iPhone6 + 自適應(yīng)高度 + 不規(guī)范的頁面布局

  1. 映射機(jī)制,是基于當(dāng)前開發(fā)好的視圖。如果我的App打包上線了(除了熱更新),那么此時(shí)骨架屏的映射結(jié)果也已經(jīng)確定了,那么我還有必要每次都去映射一遍嗎?

答案顯然是不需要的。

TABAnimated采取的是:把映射結(jié)果存儲(chǔ)在本地plist文件(大小約4kb)。唯一注意的是,TABAnimated會(huì)讀取你的App版本,當(dāng)你的App版本發(fā)生了變動(dòng),會(huì)重新映射一次。

正文目錄

  • 集成注意
  • 緩存流程
  • 存儲(chǔ)結(jié)構(gòu)
  • 線程處理
  • 特殊場景

一、集成注意

考慮到有些用戶主要關(guān)注對(duì)后續(xù)使用會(huì)有什么影響,所以該點(diǎn)放到第一位。

集成只強(qiáng)調(diào)一點(diǎn)?。?!也是最重要的一點(diǎn),反復(fù)強(qiáng)調(diào)?。?!

TABAnimated新增closeCache屬性。

  • debug 環(huán)境下,默認(rèn)關(guān)閉緩存功能(為了方便通過預(yù)處理回調(diào)調(diào)試)
  • release 環(huán)境下,默認(rèn)開啟緩存功能
  • 如果你想在 debug 環(huán)境下測(cè)試緩存功能,可以強(qiáng)制置為NO。但是這個(gè)時(shí)候請(qǐng)注意,預(yù)處理回調(diào)再做修改,無效!
  • 如果你始終都不想使用緩存功能,可以強(qiáng)制置為YES

二、緩存流程

緩存策略流程圖

下面是流程圖中相關(guān)說明:

1. 全局字典

App在啟動(dòng)時(shí)(圖左側(cè)),會(huì)預(yù)讀取對(duì)于該用戶來說加載次數(shù)最多的一部分?jǐn)?shù)據(jù)到全局字典。

全局字典內(nèi)容:key為plist文件名,value為解釋TABAnimatedManager對(duì)象的plist文件內(nèi)容

2. plist文件名

plist文件名用于唯一標(biāo)識(shí)骨架屏管理對(duì)象。

  • 起初,僅根據(jù)className唯一標(biāo)識(shí)。但是有些class會(huì)在多個(gè)地方,不同adjustBlock中出現(xiàn),即這種方式無法唯一定位某個(gè)骨架屏視圖。

  • 最好的方式是將原視圖的className+預(yù)處理回調(diào)字符串化(學(xué)過java的應(yīng)該都用過toString()吧),但是如果回調(diào)處理的東西過多,會(huì)浪費(fèi)大量資源。

  • 于是,采取的方案是:在啟動(dòng)動(dòng)畫后,獲取當(dāng)前控制視圖(control view)的UIViewController的className,
    將其合并。

fileName

3. 描述"加載次數(shù)最多"、loadCount?

為了描述加載次數(shù)最多,引入了TABAnimatedCacheModel,
TABAnimatedCacheModel同樣是用一個(gè)plist文件解釋。與TABAnimatedManager同名

  • 一個(gè)描述TABAnimatedCacheModel的plist文件,大小約為300bytes
  • 一個(gè)描述TABAnimatedManager的plist文件,大小約為3kb

loadCount字段作用:
App啟動(dòng)后,讀取沙盒中所有的TABCacheModel文件,根據(jù)loadCount降序排列TABCacheModel數(shù)組,并加載數(shù)組中前n個(gè)TABComponentManager到內(nèi)存中,存儲(chǔ)方式是全局字典。(n默認(rèn)為20)

loadCount更新機(jī)制:
啟動(dòng)動(dòng)畫后,在下一次runloop執(zhí)行時(shí),放到串行隊(duì)列中。

4. 為什么要通過TABAnimatedCacheModel計(jì)數(shù),而不是TABAnimatedManager自計(jì)數(shù)?

一個(gè)用于解釋TABAnimatedManager的plist文件大概是4kb,如果僅僅為了更新一個(gè)字段頻繁寫入,很明顯浪費(fèi)資源。
TABAnimatedCacheModel僅需要300bytes。

5. 版本控制

如果開發(fā)者在待發(fā)布的版本,對(duì)某個(gè)已經(jīng)在沙盒中存在的plist文件,其對(duì)應(yīng)視圖和預(yù)處理回調(diào)做了修改,此時(shí)需要重新寫入。所以在讀取緩存對(duì)象前,需要進(jìn)行版本校對(duì),如果不一致,需要重新使用映射機(jī)制。

太長不看???????

image

三、存儲(chǔ)結(jié)構(gòu)

image
  • 默認(rèn)生成文件夾TABAnimated
  • 默認(rèn)在TABAnimated文件夾里生成2個(gè)文件夾cacheModelcacheManager
  • cacheModel用于存儲(chǔ)TABAnimatedCacheModel對(duì)象,該對(duì)象只有2個(gè)字段,一個(gè)用于索引cacheManager,一個(gè)用于描述cacheManager的加載次數(shù),即loadCount
  • cacheManager存儲(chǔ)的就是能夠解釋骨架屏的骨架管理對(duì)象

存儲(chǔ)路徑:沙盒根目錄/Document/TABAnimated/

四、線程處理

  • 默認(rèn)創(chuàng)建一個(gè)串行隊(duì)列,調(diào)度plist文件寫入、更新任務(wù)。
  • 默認(rèn)開辟一個(gè)常駐的子線程。該線程主要負(fù)責(zé)執(zhí)行plist文件寫入、更新任務(wù)。通過添加NSMachPort端口保證該線程的runLoop不會(huì)退出。
  • 當(dāng)加載了新的(沙盒中沒有的)骨架對(duì)象,該骨架對(duì)象會(huì)立即寫入全局字典(即內(nèi)存中),但是并不急著寫入沙盒,會(huì)將該任務(wù)交由已經(jīng)創(chuàng)建好的串行隊(duì)列調(diào)度。

五、特殊場景

如果你的列表數(shù)據(jù),需要針對(duì)每一個(gè)row做特殊處理。
框架內(nèi)部重寫了getter方法,檢測(cè)到這種情況后,每次都會(huì)強(qiáng)制使用映射機(jī)制。

當(dāng)然后續(xù)會(huì)繼續(xù)探索更好的處理方式,目前先這樣處理,不會(huì)存在太大的問題~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,241評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,697評(píng)論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,406評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,772評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,973評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評(píng)論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,644評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,953評(píng)論 2 373

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,120評(píng)論 1 32
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,382評(píng)論 0 9
  • 0x00 背景 復(fù)雜網(wǎng)絡(luò)一直是個(gè)很有意思的領(lǐng)域,雖然它現(xiàn)在沒有深度學(xué)習(xí)那么火爆,但這么多年來一直在穩(wěn)步的發(fā)展,更是...
    bindog閱讀 921評(píng)論 0 3
  • 真的很感謝王老師,也感謝自己堅(jiān)持選擇了水彩基礎(chǔ)課?;叵氲谝淮卫L畫小白的嘗試,顫顫巍巍地下筆畫了個(gè)彭彭魚的閉眼照,現(xiàn)...
    光目言閱讀 297評(píng)論 1 1
  • 平湖落秋月,高峽降初雪, 默默無聲息,爽爽有前約。 雪花貼水面,姐妹情切切, 都是同淵生,今此共佳節(jié)。
    云逸1108閱讀 312評(píng)論 0 1