- 新架構嘗試
在交友中嘗試使用新架構祥山,原因在于原有的架構耦合度較高,希望能夠優(yōu)化層次結構掉伏,降低耦合度缝呕,提高項目可維護性。參考了MVVM以及尋歡現(xiàn)有的架構斧散。
-
一般APP的主要組成部分
- 數(shù)據(jù)獲取層:網(wǎng)絡請求供常,緩存數(shù)據(jù)(mem,disk)
- 業(yè)務邏輯層:數(shù)據(jù)轉(zhuǎn)換、算法邏輯
- 數(shù)據(jù)模型層:提供視圖所需數(shù)據(jù)
- 界面視圖層:視圖展示鸡捐,布局栈暇,動畫
-
這個架構也是基于以上組成部分
- 數(shù)據(jù)獲取層:
NetService
,LocalStore
- 業(yè)務邏輯層:
Logic
- 數(shù)據(jù)模型層:
ViewItem
(也可叫ViewModel,含義是一樣的) - 界面視圖層:
Controller
,View
- 數(shù)據(jù)獲取層:
-
Controller的角色
為Controller瘦身也是這個架構的目標之一,Controller的角色:視圖展示交互及數(shù)據(jù)傳遞箍镜。
這個架構中Controller的職責就很簡單了源祈,主要負責View的管理。View所需要的數(shù)據(jù)都交給Logic去處理色迂,Logic通過網(wǎng)絡請求或者從緩存數(shù)據(jù)取數(shù)據(jù)香缺,再將數(shù)據(jù)處理成ViewItem返回給Controller,Controller將ViewItem傳給View更新UI。Controller里面就不需要執(zhí)行網(wǎng)絡請求歇僧,緩存數(shù)據(jù)图张,數(shù)據(jù)處理,達到瘦身的目的。Logic和Controller是一一對應的關系祸轮,那會不會造成Logic很臃腫呢兽埃?
-
Logic的角色
Logic在這里是一個中間件/粘合劑的角色,Logic從LocalStore或者NetService中獲取數(shù)據(jù)Data倔撞,再將Data轉(zhuǎn)成ViewItem,轉(zhuǎn)換方法是ViewItem自己實現(xiàn)讲仰,再將生成的ViewItem傳給上層的Controller
-
其他角色
NetService負責網(wǎng)絡請求,LocalStore負責數(shù)據(jù)緩存痪蝇,ViewItem包含View所需的展示數(shù)據(jù)鄙陡,View和ViewItem是一一綁定的關系。
-
View盡量自定義
一些大廠把所有基礎UIView類都封裝了一次躏啰,封裝的好處在于可以全局修改和復用趁矾。如果需要多個View組合的盡量自定義封裝成一個獨立的類,好處有1.方便界面調(diào)試 2.便于復用给僵。
-
整體架構圖
-
總結
- 這個框架在初期可能會覺得很繁瑣毫捣,比如某個功能可以都放在Controller處理為何要多出幾個部分分別處理。但隨著業(yè)務的增加項目會越來越龐大帝际,項目層次越清晰會越容易維護蔓同,新人更容易上手,查找問題也更容易定位蹲诀。
- SimpleMediator
- 原來Controller之間的跳轉(zhuǎn)都寫在內(nèi)部斑粱,耦合度高還要引用對應的頭文件,不能動態(tài)修改脯爪,嘗試加入跳轉(zhuǎn)中間類來解決则北。目前實現(xiàn)很簡單:每個Controller有一個對應的ControllerId
+ (void)pushControllerWithId:(ControllerId)controllerId params:(NSDictionary *)params
params帶所需的參數(shù),每添加一個類都去實現(xiàn)這個方法痕慢。
- PerformanceMonitor
- 原來獲取Controller被銷毀內(nèi)存釋放不準確尚揣,原來的做法是在dealloc時延遲1秒取內(nèi)存,有可能1秒內(nèi)又進入新的界面或者原來內(nèi)存還沒有真正釋放∫淳伲現(xiàn)在做法是在pop后執(zhí)行viewDidDisappear將self傳給一個單例快骗,單例weak持有self,單例起個很短間隔的定時器,如果self為nil拇泛,則認為內(nèi)存釋放了滨巴。