《iOS App 開發的那些事兒》系列文章從更宏觀的角度出發,不只僅侷限於具體某個功能、界面的實現,而是結合網易雲信 iOS 端研發負責人多年的經驗,從如何優化現有代碼的角度出發,深度分析如何創造出 iOS App 開發中比較合適的規範和框架。 git
推薦閱讀
《iOS App 開發的那些事兒 1:如何創建合適的規範》github
一個合適的框架不是銀彈,在我看來框架要解決的問題歷來不是:有了框架以後,工程就能無比正確地進行下去。好的框架可以作到的事僅僅只是:下降通用問題的複雜度和減小發生錯誤的可能性。我的認爲一個良好 iOS App 框架應該是有以下特色:算法
展示層(Presentation layer):負責管理 UI 和 UIViewController。
邏輯層(Business/Service Layer):負責邏輯數據的定義和轉發,起到承上啓下的做用。
數據訪問層(Data Access Layer):負責具體 API 構造,網絡請求,數據持久化等。segmentfault
各層根據業務邏輯的複雜性內部又會使用單層或者多層結構。以數據訪問層爲例,通常又能夠細分爲網絡層,持久化層。而通常而言,展示層(UIView 和 UIViewController)都是直接使用邏輯層提供的Model進行展示,可是某些場景下每每須要不一樣的Model有相同的界面展現(如咱們的 App 易信中,會話界面,收藏界面,問一問功能都須要進行圖片的展示,但這三個模塊下的 Model 定義並不一致),這就須要增長額外的 ViewModel 層用於粘合展示層和邏輯 Model。設計模式
這是個老生常談的話題了,並非 iOS 開發獨有,展開講能夠講上幾天幾夜,不贅述。微信
這一點的好處不言而喻,全部的子 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:如何創建合適的規範》回顧該系列第一篇文章,也歡迎你們積極發表本身的見解,與咱們共同討論。性能
隨着即時通信以及音頻處理和壓縮技術的不斷髮展,效果更好、適用範圍更廣、性能更高的算法和新的技術必將不斷涌現,若是你有好的技術或者分享,歡迎關注網易雲信官方博客和 GitHub:
關注更多技術乾貨內容: 網易雲信博客
歡迎關注 網易雲信 GitHub
歡迎關注 網易雲信官網