iOS 架構(gòu)設(shè)計
1.概述
iOS 開發(fā)中,MVC(Model View Controller)是構(gòu)建iOS App的標準模式,是蘋果推薦的一個用來組織代碼的權(quán)威范式贫橙,iOS自己的庫基本都是這個模式捍歪,而它的缺點如下:
- ViewController代碼厚重
- 功能模塊劃分混亂
- 可測試性差
隨著工程越來越大也表現(xiàn)得更加明顯,繼而MVVM恨狈,MVP等架構(gòu)設(shè)計流行起來;通過這個簡單 demo 結(jié)合類圖可以清晰的看出MVVM和MVP架構(gòu)設(shè)置的特點疏哗。
2.MVVM
pg1.png
mvc中的model,添加業(yè)務(wù)邏輯成胖model拴事,再添加操作數(shù)據(jù)的接口就成了viewmodel沃斤,旨在返回UI控件可以直接使用的數(shù)據(jù),需求改動后只需改動viewmodel中生成數(shù)據(jù)的邏輯即可
思路:
- view 引用viewModel刃宵,返回view的可用數(shù)據(jù) 衡瓶,但反過來不行(即不要在viewModel中引入#import UIKit.h,任何視圖本身的引用都不應(yīng)該放在viewModel中)
- viewModel 引用model牲证,但反過來不行
- viewController 盡量不涉及業(yè)務(wù)邏輯哮针,讓 viewModel 去做這些事情
優(yōu)勢:
- View可以獨立于Model變化和修改,一個 viewModel 可以綁定到不同的 View 上
- 開發(fā)人員可以專注于業(yè)務(wù)邏輯和數(shù)據(jù)的開發(fā)(viewModel),設(shè)計人員可以專注于頁面設(shè)計
- 通常界面是比較難于測試的十厢,而 MVVM 模式可以針對 viewModel來進行測試
弊端:
- 數(shù)據(jù)綁定使得Bug 很難被調(diào)試等太,有可能是View的代碼問題,也可能是 Model的代碼有問題
- 對于過大的項目蛮放,數(shù)據(jù)綁定需要花費更多的內(nèi)存缩抡。
3.MVP
pg2.png
mvc中的view,添加特定的UI交合邏輯包颁,變成自定義view瞻想,再添加數(shù)據(jù)的填充邏輯就變成了presenter
思路:
- 將Controller中某一UI模塊單獨抽取一個presenter類,將這個模塊的UI控件操作及數(shù)據(jù)處理封裝其中娩嚼,以delegate方式通知Controller它需要關(guān)心的事件
- Controller其實將view和viewController傳遞給了P層, 這樣P層其實就擁有了控制器的權(quán)利, 完全可以行使控制器的職責.
- Controller又持有Presenter, 那么它只需要調(diào)用P層暴露出的接口, 就完全可以完成整個業(yè)務(wù)邏輯和頁面展示
- Controller只負責控制頁面跳轉(zhuǎn)蘑险,調(diào)用其它模塊。
- 任務(wù)均攤岳悟,我們將最主要的任務(wù)劃分到 Presenter 和 Model佃迄,而 View 的功能較少
優(yōu)勢:
- 模塊化UI組件,Controller結(jié)構(gòu)更加清晰贵少,責任更單一呵俏,只需關(guān)注各個大模塊的調(diào)用
- UI組件復(fù)用好
弊端:
- presenter之間的交互比較困難,模塊抽取粒度衡量難度大
4.總結(jié)
MVVM春瞬,MVP各個有各自的優(yōu)缺點柴信,主要職責是減少Controller里面的代碼量
- MVVM通過抽取業(yè)務(wù)數(shù)據(jù)邏輯而減少Controller的代碼
- MVP通過模塊化各個UI組件來減少Controller的代碼