iOS App开发的那些事儿2:如何搭建合适的框架
《iOS App開發的那些事兒》系列文章從更宏觀的角度出發,不僅僅局限于具體某個功能、界面的實現,而是結合網易云信iOS端研發負責人多年的經驗,從如何優化現有代碼的角度出發,深度分析如何創造出iOS App開發中比較合適的規范和框架。
?
推薦閱讀
iOS App開發的那些事兒1:如何建立合適的規范
?
一個合適的框架不是銀彈,在我看來框架要解決的問題從來不是:有了框架之后,工程就能無比正確地進行下去。好的框架能夠做到的事僅僅只是:降低通用問題的復雜度和減少發生錯誤的可能性。個人認為一個良好iOS App框架應該是有如下特點:
定義清晰的層次結構
l?橫向上,各模塊互相獨立,僅通過有限的幾個接口進行通訊。最理想的狀態是除核心模塊外,其他模塊都是可拔插。縱向上,各層次間依賴關系清晰,基本不出現逆向依賴的情況。
l?橫向模塊一般依賴于業務需求,常被定義成各種Service或Manager。一種好的做法是有個統一的Service管理器負責相應Serivce的加載,卸載,監聽和分發App級別的通知給相應Service,如前后臺切換,收到內存警告等。這樣做一方面容易實現上面說的模塊的可插拔化,另一方面也保證了公用特性處理的一致性。在這方面微信就做得不錯,基本所有的模塊都是從MMService繼承而來,由MMServiceCenter進行管理。當然從dump出來的頭文件也可以發現一些管理上的紊亂,比如一些ViewController都是繼承自MMService。
l?縱向的層次劃分基本各個App不會有太大區別,一般可以分為三個層次:
展現層(Presentation layer),負責管理UI和UIViewController。
邏輯層(Business/Service Layer),負責邏輯數據的定義和轉發,起到承上啟下的作用。
數據訪問層(Data Access Layer),負責具體API構造,網絡請求,數據持久化等。
各層根據業務邏輯的復雜性內部又會使用單層或者多層結構。以數據訪問層為例,一般又可以細分為網絡層,持久化層。而一般而言,展現層(UIView和UIViewController)都是直接使用邏輯層提供的Model進行展現,但是某些場景下往往需要不同的Model有相同的界面展示(如我們的App易信中,會話界面,收藏界面,問一問功能都需要進行圖片的展現,但這三個模塊下的Model定義并不一致),這就需要增加額外的ViewModel層用于粘合展現層和邏輯Model。
?
遵守SOLID原則和慎用各種設計模式
這是個老生常談的話題了,并不是iOS開發獨有,展開講可以講上幾天幾夜,不贅述。
?
定義自己的UI基類:UIView,UIViewController,UITableviewCell
這一點的好處不言而喻,所有的子View,Controller,Cell都能夠很方便的繼承基類的共有的行為,樣式。但也會引進很大的管理風險:組內成員總會經不起誘惑往基類塞各種并不普適的特性,引起基類權責的無限膨脹。大基類不僅增加組內成員對代碼的理解難度,同時也增加出現問題時的排查難度。從這方面講,微信的UIViewController基類設計就極端失敗:MMUIViewController這個類光頭文件就有上百行。
?
提供方便好用的工具類
一些好用的工具類往往會成為框架重要的有機組成部分,方便快捷地解決局部問題,同時又不引入過多的復雜度。NSTimer的retain cycle是個很容易掉去的坑,那么提供一個基于Block或者weak delegate的NSTimer的封裝就是不錯的選擇。使用KVO容易發生add和remove的不配對調用,那么就引入THObserversAndBinders或者FB的KVOContorller。某些核心模塊需要被多個模塊依賴時,引入類似XMPP的GCDMulticastDelegate就能夠方便地進行解耦。
?
好的范例
在前幾年使用C++的那段暗無天日的日子里,我常想的一個問題是:如何在API層面去限制和規避一些錯誤。比如往線程池里面扔的task必須是堆上分配的對象,那么如何去強制傳入的指針指向的是堆地址而不是棧地址呢?這種傻問題大部分情況下是無解的,有時候有解卻是個異常別扭的解。而現在我更相信破窗理論所提供的可能性:做好示范,接下來的一切都會水到渠成。
?
大家可以戳 iOS App開發的那些事兒1:如何建立合適的規范?回顧該系列第一篇文章,也歡迎大家積極發表自己的看法,與我們共同討論。
?
轉載于:https://www.cnblogs.com/wangyiyunxin/p/9241627.html
總結
以上是生活随笔為你收集整理的iOS App开发的那些事儿2:如何搭建合适的框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【总结整理】开发说不能做怎么办
- 下一篇: 超强、超详细Redis入门教程【转】