三層架構(gòu)
給
Controller減負(fù),最先要考慮的是架構(gòu)分層。平時(shí)簡單的demo,業(yè)務(wù)不復(fù)雜,從界面到數(shù)據(jù),Controller一個(gè)足夠 了。但是實(shí)際項(xiàng)目中,不分層的項(xiàng)目到最后都會(huì)顯得過于復(fù)雜。沒有架構(gòu),不行;層數(shù)太多了,也不好,接口增加,轉(zhuǎn)接也麻煩。長期實(shí)踐下來,分三層比較好。抽象出“組件”,“服務(wù)”兩層,從功能和業(yè)務(wù)兩個(gè)角度,將一些常用的內(nèi)容抽象出來,進(jìn)行復(fù)用。
為了使用方便使用,“組件”,“服務(wù)”兩層的對外接口,可以統(tǒng)一為類的靜態(tài)函數(shù)。
故事版
三層結(jié)構(gòu),最頂層的就是“模塊”層,每個(gè)模塊,可以用一個(gè)故事版來對應(yīng)。
故事版中,每一個(gè)
scene對應(yīng)的是一個(gè)Controller;而Controller包含一個(gè)self.view;這樣就把Controller和View柔和在一起了。故事版可以通過一個(gè)
Navigation Controller,將多個(gè)場景聯(lián)系起來,更能體現(xiàn)模塊內(nèi)部的緊密聯(lián)系。兩三個(gè)場景
scene就可以成為一個(gè)獨(dú)立模塊,甚至一個(gè)也可以。最好不要超過5個(gè),否則,就可以考慮繼續(xù)拆分。比如下面就是2個(gè)
scene組成的一個(gè)模塊,頁面少,用起來比較靈活。

View
故事版,適合作為模塊封裝工具,整體進(jìn)行鏈接和復(fù)用。不過,作為“組件”模式的塊狀復(fù)用,
view更加好。雖然故事版有
container和child Controller的概念。經(jīng)過實(shí)際體驗(yàn)之后,感覺還是直接使用view更方便。故事版和
view是不同的,另外view的文件后綴是xib,不過跟以前的xib也是兩回事。以前的xib,更確切地說是Controller,而不是view

故事版和
view,本質(zhì)上都是xml,當(dāng)然可以給Controller減負(fù)。代碼寫界面,那么
Controller就相當(dāng)于一個(gè)容器,具體的視圖可以分解到各個(gè)view中,也可以給Controller減負(fù)。
ViewModel
ViewModel是從Controller中分離出來的一層,是否引入存在很大的爭議
引入的情況
將
ViewModel當(dāng)做Helper看待,可以引入。作為Controller的助手,可以分擔(dān)Controller的一些工作,比如網(wǎng)絡(luò)請求,數(shù)據(jù)處理,業(yè)務(wù)邏輯等等,從而給Controller減負(fù)作為表格
cell的數(shù)據(jù)接口,可以引入。將表格需要的界面展示信息集中起來,成為一個(gè)ViewModel,比一個(gè)個(gè)零散的參數(shù)方便多了- (void)updateWithViewModel:(xxxViewModel *)viewModel;。另外,如果遇到不同的Model展示相同的界面,只要多提供幾個(gè)初始化函數(shù)就可以了。- (instance)initialWithModel:(xxxModel *)model;對于組合型的復(fù)雜場景,可以引入。比如tab類型的頁面,比如登錄分為驗(yàn)證碼和密碼兩種模式。這個(gè)時(shí)候
Controller可以作為頂層管理者,引入幾個(gè)ViewModel,分別處理不同的情況,整個(gè)情況就會(huì)清晰很多替代
childController。說實(shí)話,故事版關(guān)于segue相關(guān)的API不是很好用,引入的childController用起來也不方便。相關(guān)的功能不如用view或者ViewModel來替代更方便。替換胖
Model,比如網(wǎng)絡(luò)訪問放哪里?放Controller和Model中感覺都不合適,那么,引入一個(gè)ViewModel也是可以的
不引入的情況
簡單的頁面就不要引入了
引入
ViewModel,會(huì)增加文件個(gè)數(shù),并且會(huì)增加調(diào)用層次ReactiveObjC和ViewModel沒有關(guān)系。不過ReactiveObjC的引入,對于簡化調(diào)用關(guān)系還是很有幫助的。如果沒有ReactiveObjC,ViewModel還是不引入的好。對于
Controller中代碼多一點(diǎn)感覺無所謂的,就沒有必要增加文件了。
小結(jié)
使用故事版,可以減少代碼,同時(shí)也給
Controller減負(fù),這個(gè)支持;使用
View,不管是用xib還是用代碼寫view,可以給Controller減負(fù),支持,并且也更容易復(fù)用。抽象出組件層和服務(wù)層,增加復(fù)用,同時(shí)也給
Controller減負(fù),強(qiáng)烈支持ReactiveObjC推薦引入,可以讓Object-C更像JS,可以帶來很多方便ViewModel看具體情況引入。畢竟要增加文件,增加轉(zhuǎn)接,還是看團(tuán)隊(duì)習(xí)慣吧