給Controller減負(fù)

三層架構(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;這樣就把ControllerView柔和在一起了。

  • 故事版可以通過一個(gè)Navigation Controller,將多個(gè)場景聯(lián)系起來,更能體現(xiàn)模塊內(nèi)部的緊密聯(lián)系。

  • 兩三個(gè)場景scene就可以成為一個(gè)獨(dú)立模塊,甚至一個(gè)也可以。最好不要超過5個(gè),否則,就可以考慮繼續(xù)拆分。

  • 比如下面就是2個(gè)scene組成的一個(gè)模塊,頁面少,用起來比較靈活。

image.png

View

  • 故事版,適合作為模塊封裝工具,整體進(jìn)行鏈接和復(fù)用。不過,作為“組件”模式的塊狀復(fù)用,view更加好。

  • 雖然故事版有containerchild Controller的概念。經(jīng)過實(shí)際體驗(yàn)之后,感覺還是直接使用view更方便。

  • 故事版和view是不同的,另外view的文件后綴是xib,不過跟以前的xib也是兩回事。以前的xib,更確切地說是Controller,而不是view

image.png
  • 故事版和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ò)訪問放哪里?放ControllerModel中感覺都不合適,那么,引入一個(gè)ViewModel也是可以的

不引入的情況

  • 簡單的頁面就不要引入了

  • 引入ViewModel,會(huì)增加文件個(gè)數(shù),并且會(huì)增加調(diào)用層次

  • ReactiveObjCViewModel沒有關(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í)慣吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容