MVVM
什么是MVVM:
MVVM從字面上理解為model(數據模型),view|controller(視圖|視圖控制器),viewMode(視圖模型),Binder(綁定機制)。
- model:
MVVM中的model和MVC中的保持一致,負責容納數據信息。(PS:盡量減少在model中封裝額外的操作數據的業務邏輯,可以通過category和viewModel來實現業務邏輯。)- view:
由MVC中的view+controller組成。主要負責
在MVVM中吧view和controller結合起來,我們把它們視為一個組件。- viewModel:
用來處理MVC中controller上冗余復雜的業務邏輯,主要功能包括以下
- 封裝業務邏輯處理
- 封裝網絡處理
- 封裝緩存數據
- binder(一種綁定機制)
一種可以讓開發者方便實現view和viewModel同步,避免編寫大量繁雜的樣板化代碼,實現數據綁定。(ReactiveCocoa)
使用 MVVM 注意:
- viewController引用viewModel,但是反過來不行。(不能再viewModel中引入UIKit)。
- MVVM可以兼容MVC。
- MVVM配合一個綁定機制效果最好(ReactiveCocoa)。
- viewController盡量不涉及業務邏輯,讓viewModel去做這些。
- viewController是一個中間人,接收view的事件,調用viewModel的方法,響應viewModel的變化
- viewModel絕對不能包含視圖view(UIKit),不然就就和view產生了耦合,不方便復用和測試。
- viewModel相互之間可以有依賴
MVVM的優勢和缺點
- 優點
- 低耦合:view可以獨立于model變化和修改,一個viewModel可以綁定到不同的view上
- 可重用性:可以把一些視圖邏輯放在一個
- 獨立開發:開發人員可以專注于業務邏輯和數據開發viewModel,設計人員可以專注于頁面設計
- 可測試,可以針對于viewModel來測試
- 缺點
- bug變得難以調試,當遇到了異常,可能是view的問題,也有可能是model的問題。數據綁定使得bug快速傳遞到其他地方,要定為原始出問題的地方就變得不那么容易了。
- 對數據轉化需要花費更多的內存。主要來自于對數組內,item又再次包含數組。多次嵌套的類型。需要多次轉化才能用來view顯示。
- 對于api返回的數據類型標準化要求較高,提高modelview的復用率,否則容易出現類型爆炸,加大了維護成本。
總結
MVVM = model+(view+controller)+viewModel
MVC = model+view+controller
MVVM在MVC的基礎上,抽離出了MVC中controller上冗余復雜的業務邏輯viewModel,其中弱化了controller的概念。
總而言之,MVC和MVVM各有各的好處優點,但缺點在它們所帶來的優勢面前不值一提。它們的低耦合,封裝性,高度復用,獨立開發模塊大大提高了開發效率。同時我們也要有一個變通的心,框架是為了服務于我們寫出高質量的代碼,不是我們為了套用框架而去寫代碼。比如MVC,我們針對于其詬病,也能寫出更輕量級的controller。東西是死的,人是活的。