MVVM
什么是MVVM:
MVVM從字面上理解為model(數(shù)據(jù)模型)凯正,view|controller(視圖|視圖控制器),viewMode(視圖模型)豌蟋,Binder(綁定機制)廊散。
- model:
MVVM中的model和MVC中的保持一致,負(fù)責(zé)容納數(shù)據(jù)信息梧疲。(PS:盡量減少在model中封裝額外的操作數(shù)據(jù)的業(yè)務(wù)邏輯奸汇,可以通過category和viewModel來實現(xiàn)業(yè)務(wù)邏輯施符。)- view:
由MVC中的view+controller組成。主要負(fù)責(zé)
在MVVM中吧view和controller結(jié)合起來擂找,我們把它們視為一個組件。- viewModel:
用來處理MVC中controller上冗余復(fù)雜的業(yè)務(wù)邏輯浩销,主要功能包括以下
- 封裝業(yè)務(wù)邏輯處理
- 封裝網(wǎng)絡(luò)處理
- 封裝緩存數(shù)據(jù)
- binder(一種綁定機制)
一種可以讓開發(fā)者方便實現(xiàn)view和viewModel同步贯涎,避免編寫大量繁雜的樣板化代碼,實現(xiàn)數(shù)據(jù)綁定慢洋。(ReactiveCocoa)
使用 MVVM 注意:
- viewController引用viewModel塘雳,但是反過來不行。(不能再viewModel中引入UIKit)普筹。
- MVVM可以兼容MVC败明。
- MVVM配合一個綁定機制效果最好(ReactiveCocoa)。
- viewController盡量不涉及業(yè)務(wù)邏輯太防,讓viewModel去做這些妻顶。
- viewController是一個中間人,接收view的事件蜒车,調(diào)用viewModel的方法讳嘱,響應(yīng)viewModel的變化
- viewModel絕對不能包含視圖view(UIKit),不然就就和view產(chǎn)生了耦合酿愧,不方便復(fù)用和測試沥潭。
- viewModel相互之間可以有依賴
MVVM的優(yōu)勢和缺點
- 優(yōu)點
- 低耦合:view可以獨立于model變化和修改,一個viewModel可以綁定到不同的view上
- 可重用性:可以把一些視圖邏輯放在一個
- 獨立開發(fā):開發(fā)人員可以專注于業(yè)務(wù)邏輯和數(shù)據(jù)開發(fā)viewModel嬉挡,設(shè)計人員可以專注于頁面設(shè)計
- 可測試钝鸽,可以針對于viewModel來測試
- 缺點
- bug變得難以調(diào)試,當(dāng)遇到了異常庞钢,可能是view的問題拔恰,也有可能是model的問題。數(shù)據(jù)綁定使得bug快速傳遞到其他地方焊夸,要定為原始出問題的地方就變得不那么容易了仁连。
- 對數(shù)據(jù)轉(zhuǎn)化需要花費更多的內(nèi)存。主要來自于對數(shù)組內(nèi)阱穗,item又再次包含數(shù)組饭冬。多次嵌套的類型。需要多次轉(zhuǎn)化才能用來view顯示揪阶。
- 對于api返回的數(shù)據(jù)類型標(biāo)準(zhǔn)化要求較高,提高modelview的復(fù)用率鲁僚,否則容易出現(xiàn)類型爆炸,加大了維護成本侨艾。
總結(jié)
MVVM = model+(view+controller)+viewModel
MVC = model+view+controller
MVVM在MVC的基礎(chǔ)上,抽離出了MVC中controller上冗余復(fù)雜的業(yè)務(wù)邏輯viewModel袋励,其中弱化了controller的概念当叭。
總而言之,MVC和MVVM各有各的好處優(yōu)點磺芭,但缺點在它們所帶來的優(yōu)勢面前不值一提钾腺。它們的低耦合琅攘,封裝性,高度復(fù)用哨查,獨立開發(fā)模塊大大提高了開發(fā)效率剧辐。同時我們也要有一個變通的心,框架是為了服務(wù)于我們寫出高質(zhì)量的代碼荧关,不是我們?yōu)榱颂子每蚣芏懘a忍啤。比如MVC,我們針對于其詬病鳄梅,也能寫出更輕量級的controller。東西是死的戴尸,人是活的冤狡。