2020.3.23更:
以下并不算是真正的MVVM笨鸡,因為還是有業(yè)務(wù)代碼和網(wǎng)絡(luò)請求寫在VC,這并不能做到一個干凈的VC昆箕。下面評論有個大哥說得很對??~
本文根據(jù)一個簡單的例子來闡述MVVM框架設(shè)計模式.
如圖,像這種cell我們可以在微博,新聞等很多軟件看到. 這種cell的特點就是比較復(fù)雜, 它的高度是不確定的, 是根據(jù)網(wǎng)絡(luò)請求回來的數(shù)據(jù)動態(tài)計算高度的.
cell的高度我們是通過table view的一個代理方法
heightForRowAtIndexPath來設(shè)置的,而這個方法是要寫在控制器里面的.這就意味著如果我們用MVC的模式,那么就意味著我們要在控制器的這個代理方法里面動態(tài)的計算cell 的高度,像這種復(fù)雜的cell計算的的代碼是非常多的. 這就讓我們的控制器里面要寫的代碼非常多. 這樣子控制器將非常臃腫.
而我們是面向模型開發(fā),我們希望控制器里面不要參雜太多的業(yè)務(wù)邏輯,我們希望控制器只是一個調(diào)配資源的角色, 就像總經(jīng)理一樣吩咐著各種女秘書去做事, 而自己不用具體地做事.
那就在這里引入MVVM的概念.我們希望把cell的高度計算都寫在另外一個地方(這個地方叫View Model).
首先介紹一下MVVM:
M是指Model: 保存網(wǎng)絡(luò)數(shù)據(jù)
V是指View: 展示UI界面
VM是指View Model: 保存View的具體參數(shù),包括內(nèi)容和frame等
使用MVVM的好處是邏輯性非常強,擴展性非常好, 寫代碼的人寫起來會非常順暢且有條理性.
MVVM的缺點就是閱讀性不好,對于不太熟練的人讀起來會比較有難度, 這就一定程度導(dǎo)致維護成本的增加.
那么我們現(xiàn)在有4個東西: Controller, Model, View, View Model
這4個東西相互之間是怎么通訊和信息傳遞的呢? 請看下圖:
在控制器中,拿到網(wǎng)絡(luò)請求回來的數(shù)據(jù), 轉(zhuǎn)化為View Model, 再把View Model賦值給View . View拿到View Model后,根據(jù)View Model的參數(shù)來展示數(shù)據(jù).
那么我們回到頭文的例子,我們把這個cell劃分為三個小塊View, 把這三個View添加并展示在cell上:
在控制器中,拿到網(wǎng)絡(luò)數(shù)據(jù),并轉(zhuǎn)成View Model,然后給cell的vm屬性賦值
在View Model中重寫item屬性的setter方法,計算cell的具體高度
在cell中創(chuàng)建各個子view,并重寫view model屬性的setter方法,給子view的item屬性賦值
在子View中拿到item,重寫item屬性的setter方法并把item展示的網(wǎng)絡(luò)數(shù)據(jù)展示在UI界面
網(wǎng)絡(luò)數(shù)據(jù)傳遞的過程是:
控制器 --(通過ViewModel)--> cell --(通過item)--> 子View
最后請看下圖,我保證你不會再滾到頭文中再看一遍第一張圖