淺談 iOS 開發(fā)框架的重要性

不論是前端,后臺,移動端,結(jié)合到現(xiàn)實生活中,處處都會涉及到框架的應(yīng)用,一個初期就設(shè)計優(yōu)良的架構(gòu),素容置疑在項目的可維護性,擴展性,健壯性肯定都有很大的提升。所以我們必須要在開發(fā)之前在架構(gòu)上面多下功夫!

對于一個項目來說 架構(gòu) 一直是個值得關(guān)注的大話題, 這里我將其劃分為幾個部分去思考,設(shè)計。

文件目錄模塊架構(gòu), Coding設(shè)計模式層面架構(gòu) , 網(wǎng)絡(luò)層框架架構(gòu), 數(shù)據(jù)持久化架構(gòu), UIKit層面架構(gòu),暫時先以這幾個重要的層面去考慮,和設(shè)計。我們來依次討論這幾個模塊的理解和設(shè)計方案。

文件目錄模塊架構(gòu)

對于一個項目來說,最直觀的設(shè)計就是在文件目錄結(jié)構(gòu)上,一個好的文件目錄結(jié)構(gòu)劃分能讓我們自己在開發(fā)過程中更加快速編寫代碼,也能讓新加入的同事更快速的融入到項目中來,你想一下如果文件目錄劃分清晰明了,和一個雜亂無章的目錄結(jié)構(gòu),那個閱讀起來舒服?其就像一本書的編寫排版,讀完排序之后讀者基本讀整本書內(nèi)容有一個清晰的認(rèn)識,以及在后面閱讀起來隨時能通過排序來找到相應(yīng)的章節(jié).

所以在開發(fā)前期我們都應(yīng)該根據(jù)我們當(dāng)前項目所有涉及到的業(yè)務(wù)場景,需要使用到的模塊心里都要有一個準(zhǔn)備,參考了一些開源項目,以及網(wǎng)上關(guān)于項目目錄劃分的文章, 主流的劃分邏輯大概是分為兩種.

  1. 按項目內(nèi)每個大的模塊功能來進行文件夾劃分.

  2. 按主要的設(shè)計模式來進行劃分,例如: ViewController. View.Model VS ViewModel等.

個人更傾向于第一種, 舉個栗子. 以********支付寶********為例,項目 TabBar 分為 5 個大模塊, 一個是首頁,財富,口碑,朋友,我的. 然后在依次建立 5 個相應(yīng)的文件夾,當(dāng)然還會有一些涉及功能很多的模塊,比如項目里面的商城,生活號,小程序等,雖然可能都包含在這 5 個大的模塊里面, 我們可以根據(jù)實際場景結(jié)合業(yè)務(wù), 如果某個模塊業(yè)務(wù)涉及場景和業(yè)務(wù)比較復(fù)雜, 都可以單獨為其建立一個獨立的文件夾, 與其他 5 個模塊進行平級別的劃分。

除了對模塊進行劃分外,我們在對項目里面肯定都會包含的網(wǎng)絡(luò)層,數(shù)據(jù)持久層,工具類庫層,三方資源層等等...這些在項目中使用率高的核心層面,也單獨劃分成一個文件夾的形式,方便以后新增代碼的時候,將其按功能點來添加和劃分。

這樣我們開發(fā)過程中查找相應(yīng)類文件,新增的時候也不會浪費太多的時間,也方便其他人閱讀。

設(shè)計模式層面架構(gòu)

這里主要是涉及到 設(shè)計模式的選擇上, 目前比較主流的有 MVC.MVVM.MVP。然后我參考了知名應(yīng)用 小猿搜題庫 出的設(shè)計模式架構(gòu)篇, 其主要是圍繞 MVC 和 MVVM 將其優(yōu)缺點進行一個優(yōu)良改造版. 在兩種架構(gòu)中權(quán)衡而產(chǎn)生的架構(gòu)MVVM without Binding with DataController, 我覺得很值得大家去參考,學(xué)習(xí).

關(guān)于在設(shè)計模式上, 我覺得還是應(yīng)該結(jié)合自己實際業(yè)務(wù)場景去進行選擇最好, 不需要太死板要求為了遵守這種設(shè)計模式而遵守。每一種設(shè)計都有其優(yōu)缺點, 我們應(yīng)該權(quán)衡其利與弊抱著學(xué)習(xí)的態(tài)度來對待, 只要其能真正解決我們的痛點就是一個好的設(shè)計模式, 在選擇上面我比較傾向于項目中多種設(shè)計模式公用的做法。 具體根據(jù)當(dāng)前業(yè)務(wù)場景來。

網(wǎng)絡(luò)框架架構(gòu)

為什么要對網(wǎng)絡(luò)層進行封裝. 網(wǎng)絡(luò)層的代碼幾乎遍布我們每一個頁面, 想象一下假如我們不對網(wǎng)絡(luò)層進行一個良好的封裝, 每次調(diào)用原生庫 NSURLSession 來請求一段網(wǎng)絡(luò)大家會是什么心情? 在想象一個每次我們請求網(wǎng)絡(luò)的時候基本都會添加一些公共參數(shù),緩存處理,統(tǒng)一錯誤碼等處理吧, 還有請求返回格式化設(shè)置等等. 這些都是基本很少變動的配置, 我們對其都做好封裝,上層直接傳入請求方法,URL,進來即可.

上面說的比較淺, 相信大家在項目中對網(wǎng)絡(luò)層封裝至少都 2 層以上, 本人主要是對 AFNetWorking 進行的一個封裝, 第一層封裝主要對 AFHttpSeesionManage 的初始化設(shè)置以及安全策略,證書校驗,還有請求超時處理等. 第二層則是直接獲取網(wǎng)絡(luò)的類,對其做了一些添加公共參數(shù),處理返回數(shù)據(jù)公共邏輯,返回結(jié)果錯誤碼,添加緩存,緩存處理等。

這樣做的好處有幾點.

1. 假如有一天 AFNetWorking 不更新維護了, Apple 棄用了其最新版本的基于 NSURLSession 的網(wǎng)絡(luò)請求類, 我們可能需要考慮更換一個新的底層網(wǎng)絡(luò)庫. 我們只需要更改第一層封裝庫的代碼即可。 大大降低了對三方庫的依賴關(guān)系

2. 通過第一層封裝不僅完成了 降低依賴關(guān)系, 我們還做了公共的配置, 方便后續(xù)在做網(wǎng)絡(luò)請求時, 不需要再重新配置, 實現(xiàn)只配置一次即可共全局使用的效果。 類似的第二層添加公共參數(shù)也是如此。

3. 第二層封裝主要是我們在實際業(yè)務(wù)場景中,基本每個網(wǎng)絡(luò)請求都會攜帶一些公共參數(shù), 比如當(dāng)前項目版本號,設(shè)備號,時間等,后臺要求每次請求都要攜帶上這些公共參數(shù), 我們將其封裝起來。

4. 處理請求結(jié)果錯誤碼,基本同理。

總結(jié):不寫重復(fù)的代碼。

數(shù)據(jù)持久化架構(gòu)

由于項目是主打 IM 即時通訊的, 會涉及到很多數(shù)據(jù)都需要保存到本地, 以及讀取緩存的操作, 所以后期肯定要在數(shù)據(jù)緩存處理,數(shù)據(jù)讀取,數(shù)據(jù)存儲上做精心設(shè)計. 這一塊目前自己能力有限, 主要我們先參考大神文章為主. 留個坑, 后續(xù)我們在來補上, 希望有數(shù)據(jù)結(jié)構(gòu)設(shè)計,緩存處理方案的大神能指一二。

UIKit層面架構(gòu)

UIKit 層面涉及到的范圍也比較廣, 我主要從視圖控制器下手進行封裝, 采用 BaseViewController 的方式, 對 ViewController 和 UINavigationController 以及 UITabBarController 等進行一個 基類控制器的封裝, 將一些統(tǒng)一的參數(shù),業(yè)務(wù)等進行配置, 方便后續(xù)在項目中類似的控制器中, 直接通過集成 BaseViewController 就可以輕松實現(xiàn)的功能.

結(jié)語

作者水平有限,文中可能有說的不對,或者錯誤的地方歡迎大家指正。

主要是通過參考網(wǎng)上比較出名的文章,結(jié)合自己項目實際場景來進行,后續(xù)我會把自己看到的相關(guān)資料統(tǒng)統(tǒng)放下面供大家參考! 非常感謝這些大神,前輩為我們提供如此精辟的技術(shù)分享,如同一盞黑暗里的明燈,不斷指引我們走向光明大道!

參考資料:

iOS應(yīng)用架構(gòu)談 view層的組織和調(diào)用方案

猿題庫 iOS 客戶端架構(gòu)設(shè)計

被誤解的 MVC 和被神化的 MVVM

淺談 MVC、MVP 和 MVVM 架構(gòu)模式

淺析 iOS 應(yīng)用網(wǎng)絡(luò)層設(shè)計

iOS應(yīng)用架構(gòu)談 網(wǎng)絡(luò)層設(shè)計方案

做一個 App 前需要考慮的幾件事

onmyway133/fantastic-ios-architecture 設(shè)計模式架構(gòu)思想?yún)R總

老碼農(nóng)冒死揭開行業(yè)黑幕:如何編寫無法維護的代碼

不錯開源項目

iOS 視圖控制器轉(zhuǎn)場詳解

今日頭條:iOS 架構(gòu)設(shè)計雜談

優(yōu)秀的 iOS 應(yīng)用架構(gòu):MVVM、MVC、VIPER,孰優(yōu)孰劣

iOS應(yīng)用架構(gòu)現(xiàn)狀分析

希望此篇文章對您有所幫助,如有不對的地方,希望大家能留言指出糾正。謝謝!?。。?!

學(xué)習(xí)的路上,與君共勉!!!

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

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

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,229評論 3 119
  • 我們了解了如何迭代 dict 的key和value,那么,在一個 for 循環(huán)中,能否同時迭代 key和value...
    OoYoO閱讀 179評論 0 0
  • 林染就這么呆呆地坐著,也不說話,低著頭,偶爾裝作不經(jīng)意的抬頭偷偷看幾眼瘋子,瘋子也好像沒有發(fā)覺,與旁邊多年的閨蜜談...
    沐初林染閱讀 104評論 0 0
  • 昵稱:颯颯秋風(fēng)爽why 居住地點:張掖 交友宣言:交友這件事,相處時,若是脾氣相投,自然親近;淡了,距離變遠(yuǎn),也無...
    颯颯秋風(fēng)爽why閱讀 279評論 2 3

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