一、框架&架構(gòu)作用
- 模塊化
- 分層
- 解耦
- 降低代碼重合度
二、圖片緩存框架
怎樣設(shè)計(jì)一個(gè)圖片緩存框架?
2.1 圖片讀寫(xiě)
圖片通過(guò)什么方式進(jìn)行讀寫(xiě)皿哨,過(guò)程怎樣的?
- 以圖片URL的單向Hash值作為Key
讀取流程
2.2 內(nèi)存設(shè)計(jì)
內(nèi)存的設(shè)計(jì)上需要考慮哪些問(wèn)題
-
存儲(chǔ)的空間大小Size筷黔,根據(jù)圖片的大小分為不同的存儲(chǔ)區(qū)域往史,例如:使用頻率高占空間小的會(huì)保存的張數(shù)多,占內(nèi)存大的圖片保存的張數(shù)少佛舱。
image.png
-
淘汰策略,第一種隊(duì)列先進(jìn)先出的方式淘汰挨决。第二種LRU算法(最近最久未使用算法)请祖,在固定時(shí)長(zhǎng)內(nèi)是否使用過(guò),未使用則淘汰脖祈。需要注意時(shí)間/空間開(kāi)銷(xiāo)問(wèn)題肆捕。提高檢查觸發(fā)頻率檢測(cè),檢測(cè)方案如下圖所示盖高。
image.png
2.3 磁盤(pán)設(shè)計(jì)
磁盤(pán)設(shè)計(jì)需要考慮哪些問(wèn)題慎陵?
存儲(chǔ)方式選擇
大小限制
淘汰策略
2.4 網(wǎng)絡(luò)部分的設(shè)計(jì)
網(wǎng)絡(luò)部分的設(shè)計(jì)需要考慮哪些問(wèn)題眼虱?
圖片請(qǐng)求最大并發(fā)量
請(qǐng)求超時(shí)策略,例如:請(qǐng)求失敗時(shí)席纽,重新請(qǐng)求捏悬。
請(qǐng)求優(yōu)先級(jí),是否是用戶當(dāng)前緊急使用的圖片润梯。
2.5 圖片解碼
對(duì)于不同格式的圖片过牙,解碼采用什么方式?
- 應(yīng)用策略模式對(duì)不同圖片格式進(jìn)行解碼
在哪個(gè)階段做圖片解碼處理纺铭?
磁盤(pán)讀取后或者網(wǎng)絡(luò)請(qǐng)求后寇钉。
三、時(shí)長(zhǎng)統(tǒng)計(jì)框架
怎樣設(shè)計(jì)一個(gè)時(shí)長(zhǎng)統(tǒng)計(jì)框架舶赔?
image.png
記錄器 基于不同的場(chǎng)景提供關(guān)于記錄的封裝扫倡、適配。一般分為頁(yè)面式竟纳,流式镊辕,自定義式。
記錄管理者 管理統(tǒng)計(jì)記錄數(shù)據(jù)蚁袭,包含記錄緩存征懈,磁盤(pán)存儲(chǔ),上傳器揩悄。
如何降低數(shù)據(jù)的丟失率卖哎? 兩種解決方案:
定期寫(xiě)入磁盤(pán)
每當(dāng)記錄條數(shù)達(dá)到某個(gè)值的時(shí)候,寫(xiě)入到磁盤(pán)
記錄上傳的時(shí)機(jī)
前后臺(tái)切換的時(shí)候上傳
從無(wú)網(wǎng)到有網(wǎng)切換的時(shí)候上傳
通用輕量接口附帶上傳(不常用)
上傳時(shí)機(jī)的選擇
立即上傳
定時(shí)上傳
延時(shí)上傳
四删性、復(fù)雜頁(yè)面架構(gòu)設(shè)計(jì)案例
從三個(gè)方面分析架構(gòu)設(shè)計(jì):整體架構(gòu)亏娜、數(shù)據(jù)流、反向更新蹬挺。
4.1 整體架構(gòu)
4.1.1 視圖層(View&ViewController)
View
的功能包含:控件的初始化维贺、設(shè)置數(shù)據(jù)、交互事件代理等巴帮。 ViewController
的功能:視圖創(chuàng)建與組合溯泣、協(xié)調(diào)邏輯、事件回調(diào)處理等榕茧,事件回調(diào)處理指的是視圖層的事件垃沦。
4.1.2 業(yè)務(wù)邏輯層(ViewModel)
業(yè)務(wù)邏輯處理(預(yù)排版)、數(shù)據(jù)增刪改查封裝者用押、線程安全處理(保證數(shù)據(jù)刷新和用戶手動(dòng)更新數(shù)據(jù)的數(shù)據(jù)同步)肢簿。
4.1.3 數(shù)據(jù)層 (Engine & Model)
網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)解析、增刪改查池充、本地處理邏輯(適配)
4.2 數(shù)據(jù)流
數(shù)據(jù)流包含:網(wǎng)絡(luò)數(shù)據(jù)桩引、業(yè)務(wù)數(shù)據(jù)、UI數(shù)據(jù)三部分收夸。 網(wǎng)絡(luò)數(shù)據(jù)經(jīng)過(guò)Engine
層處理加工產(chǎn)生業(yè)務(wù)數(shù)據(jù)坑匠,業(yè)務(wù)數(shù)據(jù)經(jīng)過(guò)ViewModel
層處理產(chǎn)生UI數(shù)據(jù),UI數(shù)據(jù)會(huì)轉(zhuǎn)交給視圖控制器控制視圖的顯示咱圆。
業(yè)務(wù)數(shù)據(jù)強(qiáng)引用網(wǎng)絡(luò)數(shù)據(jù)和UI數(shù)據(jù)笛辟,同時(shí)UI數(shù)據(jù)通過(guò)弱引用找到業(yè)務(wù)數(shù)據(jù)。
4.3 反向更新
用戶交互網(wǎng)絡(luò)刷新等都會(huì)導(dǎo)致視圖層變化序苏,通過(guò)代理方式通知視圖控制器手幢。控制器對(duì)ViewModel的強(qiáng)引用找到對(duì)應(yīng)ViewModel忱详,然后通過(guò)UI數(shù)據(jù)對(duì)業(yè)務(wù)數(shù)據(jù)的弱引用找到對(duì)應(yīng)的業(yè)務(wù)數(shù)據(jù)同時(shí)打上臟標(biāo)記(借鑒系統(tǒng)UIView更新機(jī)制的思想)围来。最后ViewModel進(jìn)行數(shù)據(jù)流的重新驅(qū)動(dòng),將臟數(shù)據(jù)重新處理生成新的UI數(shù)據(jù)更新視圖匈睁。
4.4復(fù)雜頁(yè)面架構(gòu)設(shè)計(jì)中設(shè)計(jì)思想總結(jié)
五客戶端的整體架構(gòu)
首先由獨(dú)立于APP的通用層监透,包括網(wǎng)絡(luò)請(qǐng)求,頁(yè)面瀏覽時(shí)長(zhǎng)統(tǒng)計(jì)航唆,崩潰統(tǒng)計(jì)胀蛮,位置定位等基本功能和常用的第三方庫(kù)。第二層是公司的通用業(yè)務(wù)層糯钙,包括分享粪狼,支付和通用的為通用業(yè)務(wù)封裝的分類(lèi)。第三層是中間層任岸,負(fù)責(zé)向上層的具體業(yè)務(wù)提供接口和具體業(yè)務(wù)間的通信再榄。
具體業(yè)務(wù)間的通信方式
- OpenURL
-
中間件依賴注入
image.png