你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> 如何深度重構UIViewController實例

如何深度重構UIViewController實例

編輯:IOS開發基礎

之前寫過一篇深度重構UIViewController,中間簡單的提到過我現階段是如何重構Controller這一層的。之後不少同學聯系我索要demo代碼,果然是no code, no BB。

抽空把之前做過的一個直播App Controller這一層抽離出了一個簡單的demo,把關鍵的和業務相關的代碼全部去掉了,剩下一個列表和直播界面,但能從中看出完整的流程。

重構思路

重構的思路在之前的文章深度重構UIViewController已經做過詳細介紹,可以下圖歸納:

cc04.png

分為Controller,View,Presenter,Interactor,Adapter。Controller和View同MVC,Presenter配合Category語法負責業務邏輯和狀態維護,Interactor做頁面路由,Adapter處理UITableView的DataSource和Delegate。

附上代碼之前,再啰嗦幾句分享下我對於Controller這一層代碼的看法。

減少體力勞動

Controller這一層裡面有相當多的體力勞動,每做一個新feature,就要新建一些Controller相關的類,UIViewController,Presenter,UIView,UITableVIew,DataSource,Delegate等等,我想過很多辦法來減少這些體力勞動帶來的損耗。

比如使用一些第三方的Xcode插件,用Peckham做頭文件快速導入,用KSImageNamed書寫UIImage,甚至還自己做了一款FastStub來生成一些常用代碼,情況有所改善,但效率還是不夠高。

再後來想通過腳本來一鍵生成Controller,現階段流行的各種MVX系列,提供了一定程度的抽象,但具體到項目當中需要明確哪些代碼是每次都重復敲寫的,不同的Controller復雜度不一樣,所需要的類單位,粒度大小都不一致,所以在寫腳本之前,需要先對Controller做歸類分析。

Controller分類

從2010年開始新建第一個UIViewController文件,到今天已經記不清有多少個了。做過的業務也非常之多,總體感覺下來,從復雜度的角度來說,可以將Controller分為以下三類:

第一類,簡單靜態Controller

這類Controller沒有多少復雜的業務代碼,大部分時候是靜態展示,或者是用戶點個按鈕觸發一個頁面跳轉這一類,比如App的About頁面,Privacy頁面,或者是簡單的Profile頁面,這些頁面簡單到一個xib文件,加上一個UIButton回調就結束了。這類Controller的代碼幾乎一目了然,甚至不需要用什麼MVP,MVVM來做重構,維護起來也是砍瓜切菜一樣輕松。

第二類,中等復雜度業務型Controller

這類Controller有一定量的業務代碼在其中,而且未來也有進一步增長的可能性,使用自帶的MVC已經不能很好的應付復雜度。這類Controller占用了我們絕大多數的編碼和debug時間,也是平常技術圈討論MVX系列的原動力。我這幾年新建的UIViewController大部分都屬於這一類,這類Controller我現階段是使用之前文章中提到過的CDD來做重構的,總體來說是部分參考MVP,部分參考VIPER,再結合我自己的經驗做了一些功能類的劃分,將每次新建Controller所做的重復工作都用模板保存了。

這類Controller再細一點來說還可以分為兩類,帶UITableView和不帶UITableView的,如果帶UITableView,我會在腳本裡把UITableView的創建,datasource,delegate的設置,cell的綁定等等一並做好,UITableView相關的代碼我也敲到快要吐了,所以用腳本生成之後,有種說不出來的輕松感。根據是否帶UITableView,我做了兩個模板:

33.png

不光節省了很多新建文件,串聯各個類的勞動,還把團隊的架構達成了驚人的一致,每個人的代碼看起來都像是同一個人寫的一樣。模板中各個類的用處,可以參考我之前架構分析的文章。

第三類,極度復雜重業務型Controller

這類Controller往往是App的核心功能所在,業務重度堆積,且隨著每個版本的迭代會進一步的膨脹。我之前舉例過直播界面的例子,

這類Controller往往比較少,所以不需要特別的模板來生成,在第二類Controller模板的基礎之上做一些定制就行了。主要是使用Objective C當中的Category語法,對Presenter做進一步的業務劃分。View的復雜度可以通過CDD來解決,不清楚CDD的可以參考這篇博文iOS應用層架構之CDD,下圖就是demo當中的直播Controller結構:

010.png

可以看到EStreamPresenter+Gift這樣一個拓展,以及View目錄下各個子View的劃分,我們可以根據業務的復雜度進一步的增加Category和子View的數量,不會導致結構的失控,也不需要在維持架構的清晰上寫額外的代碼。

按需定制

上述結構以及demo中的模板,只是我根據過往經驗所做的高度抽象,大家也可以按照自己的理解和方式來做定制,Template相關的代碼都在Resource目錄下。重點在於避免平常工作當中的重復體力勞動。

順道安利下demo當中這一套重構Controller的方式,多年含著淚摸爬滾打總結出的經驗。具體demo的代碼就不放github騙星星了,感興趣的同學可以在公眾號回復c,獲取demo的壓縮包,可以直接運行。

歡迎關注公眾號:MrPeakTech

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved