一、前言
現(xiàn)在網(wǎng)上一抓一大把都是MVVM講解,但是demo大部分都是MVVM+RAC的,較少有用oc現(xiàn)有的如block,delegate等來(lái)充當(dāng)膠水作用的demo。本文附上MVVM+block的demo來(lái)講解MVVM的原理。
源來(lái):
因?yàn)镸VC嚴(yán)重困擾開發(fā)者的問(wèn)題:
厚重的ViewController
遺失的網(wǎng)絡(luò)邏輯(沒(méi)有屬于它的位置)
較差的可測(cè)試性
所以出現(xiàn)了新的架構(gòu)MVVM
二、什么是MVVM
概念:(如圖)
簡(jiǎn)單的說(shuō)就是在MVC的基礎(chǔ)上,把C拆出 個(gè)ViewModel專負(fù)責(zé)數(shù)據(jù)和相關(guān)邏輯處理的東西,就是MVVM。
各個(gè)的作用:
1.view作用:控制視圖的UI。通過(guò)viewModel控制它的顯示,點(diǎn)擊它的控件通過(guò)viewModel刷新model。(由于用block,中間需要vc的膠水作用)
2.viewController的作用:充當(dāng)viewModel和view的膠水作用。
3.viewModel的作用:處理相關(guān)邏輯(業(yè)務(wù),視圖顯示)和網(wǎng)絡(luò)請(qǐng)求,橋接model和view,viewController的作用。
4.model的作用:存儲(chǔ)數(shù)據(jù)。通過(guò)viewModel刷新view的顯示,view點(diǎn)擊事件通過(guò)viewModel刷新自己。(由于用block,中間需要vc的膠水作用)
進(jìn)一步闡述:
姑且將view和viewController看成view
1.在MVVM中,view不能直接引用model,而是通過(guò)引用viewModel來(lái)間接引用model,反過(guò)來(lái)也是不能。
2.view可以引用viewModel ----- (viewModel也可以引用view如loading,最好不要,確保viewModel只處理邏輯和網(wǎng)絡(luò)相關(guān),這樣耦合度更低,也方便測(cè)試)
3.viewModel可以引用model,反過(guò)來(lái)最好不要(保持mvvm純粹的結(jié)構(gòu))
4.viewModel里面應(yīng)該放些什么樣的東西呢?一般viewModel中放置相關(guān)邏輯(業(yè)務(wù),視圖顯示)及網(wǎng)絡(luò)請(qǐng)求
充當(dāng)膠帶作用有(demo僅僅使用block):
ReactiveCocoa(RAC),KVO,Notification,block,delegate和target-action
優(yōu)點(diǎn):
方便測(cè)試:通常來(lái)說(shuō),要進(jìn)行,界面測(cè)試比較困難,而MVVM可以對(duì)viewModel進(jìn)行測(cè)試(還沒(méi)搞過(guò),有時(shí)間搞下下)
方便業(yè)務(wù)的復(fù)用:例如把一些視圖邏輯放在一個(gè)ViewModel里面,讓很多view/ViewController進(jìn)行重用
方便對(duì)職責(zé)進(jìn)行劃分:例如可以讓一些人專門開發(fā)UI,一些人專門開發(fā)邏輯
代碼更加優(yōu)雅,增加可維護(hù)性,耦合度降低
缺點(diǎn):
造成大量膠水代碼:當(dāng)頁(yè)面的交互邏輯非常多時(shí),需要頻繁的在V/VC-VM-M來(lái)回傳遞信息。(所以大家都用RAC就是因?yàn)檫@個(gè)原因,能相對(duì)減少些膠水代碼)
代碼寫起來(lái)會(huì)更費(fèi)勁一點(diǎn)
三、MVVM實(shí)例
1.目錄結(jié)構(gòu)如下:
view:
viewController:
viewModel:
Model:
四、總結(jié):
寫這邊文章主要是通過(guò)一個(gè)簡(jiǎn)單的demo讓不太懂RAC的人先了解下MVVM的基本思想,這里主要是我對(duì)MVVM思想的理解,如果有什么其他想法的,歡迎各位大神不吝賜教,共同進(jìn)步!大家有什么疑惑我們可以在評(píng)論區(qū)交流!
接下來(lái)要干嘛
1.寫篇MVVM +RAC的文章
2.對(duì)viewModel模塊進(jìn)行相關(guān)的單元測(cè)試(聽(tīng)說(shuō)很好用)
五、Demo
代碼地址:github.com/lsj731965675/MVVMTest
本文由簡(jiǎn)書作者原創(chuàng)編寫,轉(zhuǎn)載請(qǐng)保留版權(quán)網(wǎng)址,感謝您的理解與分享!