MVVM 是一種軟件架構(gòu)模式凉敲,它是 Martin Fowler 的 Presentation Model 的一種變體,最先由微軟的架構(gòu)師 John Gossman 在 2005 年提出,并應(yīng)用在微軟的 WPF 和 Silverlight 軟件開發(fā)中。MVVM 衍生于 MVC ,是對 MVC 的一種演進(jìn),它促進(jìn)了 UI 代碼與業(yè)務(wù)邏輯的分離糜工。
MVC 與 MVVM 有什么異同點,MVC 到 MVVM 是怎樣演進(jìn)的录淡;
MVC
MVC 是 iOS 開發(fā)中使用最普遍的架構(gòu)模式捌木,同時也是蘋果官方推薦的架構(gòu)模式。MVC 代表的是 Model–view–controller 嫉戚,它們之間的關(guān)系如下:
是的刨裆,MVC 看上去棒極了,model 代表數(shù)據(jù)彬檀,view 代表 UI 帆啃,而 controller 則負(fù)責(zé)協(xié)調(diào)它們兩者之間的關(guān)系。然而窍帝,盡管從技術(shù)上看 view 和 controller 是相互獨立的努潘,但事實上它們幾乎總是結(jié)對出現(xiàn),一個 view 只能與一個 controller 進(jìn)行匹配坤学,反之亦然疯坤。既然如此,那我們?yōu)楹尾粚⑺鼈兛醋饕粋€整體呢:
因此深浮,M-VC 可能是對 iOS 中的 MVC 模式更為準(zhǔn)確的解讀压怠。在一個典型的 MVC 應(yīng)用中,controller 由于承載了過多的邏輯飞苇,往往會變得臃腫不堪刑峡,所以 MVC 也經(jīng)常被人調(diào)侃成 Massive View Controller :
iOS architecture, where MVC stands for Massive View Controller.
坦白說洋闽,有一部分邏輯確實是屬于 controller 的,但是也有一部分邏輯是不應(yīng)該被放置在 controller 中的突梦。比如,將 model 中的 NSDate 轉(zhuǎn)換成 view 可以展示的 NSString 等羽利。在 MVVM 中宫患,我們將這些邏輯統(tǒng)稱為展示邏輯。
MVVM
因此这弧,一種可以很好地解決 Massive View Controller 問題的辦法就是將 controller 中的展示邏輯抽取出來娃闲,放置到一個專門的地方,而這個地方就是 viewModel 匾浪。其實皇帮,我們只要在上圖中的 M-VC 之間放入 VM ,就可以得到 MVVM 模式的結(jié)構(gòu)圖:
從上圖中蛋辈,我們可以非常清楚地看到 MVVM 中四個組件之間的關(guān)系属拾。注:除了 view 、viewModel 和 model 之外冷溶,MVVM 中還有一個非常重要的隱含組件 binder :
view :由 MVC 中的 view 和 controller 組成渐白,負(fù)責(zé) UI 的展示,綁定 viewModel 中的屬性逞频,觸發(fā) viewModel 中的命令纯衍;
viewModel :從 MVC 的 controller 中抽取出來的展示邏輯,負(fù)責(zé)從 model 中獲取 view 所需的數(shù)據(jù)苗胀,轉(zhuǎn)換成 view 可以展示的數(shù)據(jù)襟诸,并暴露公開的屬性和命令供 view 進(jìn)行綁定;
model :與 MVC 中的 model 一致基协,包括數(shù)據(jù)模型歌亲、訪問數(shù)據(jù)庫的操作和網(wǎng)絡(luò)請求等;
binder :在 MVVM 中堡掏,聲明式的數(shù)據(jù)和命令綁定是一個隱含的約定应结,它可以讓開發(fā)者非常方便地實現(xiàn) view 和 viewModel 的同步,避免編寫大量繁雜的樣板化代碼泉唁。在微軟的 MVVM 實現(xiàn)中鹅龄,使用的是一種被稱為XAML的標(biāo)記語言。
下面創(chuàng)建項目-簡單Demo展示MVVM
這就是ViewModel需要做的事情亭畜,做好網(wǎng)絡(luò)請求扮休,獲取數(shù)據(jù),轉(zhuǎn)換為模型拴鸵,然后我們在VC中調(diào)用玷坠,Model模型里面存儲的是name蜗搔,icon,intro屬性八堡,那么接下來我們來看控制器做了什么事情
這樣就完成了樟凄,筆者還不會markDown語法,寫的布局垃圾兄渺,請不要噴我缝龄,有不懂的,需要要demo的可以聯(lián)系1170758545@qq.com挂谍,謝謝叔壤!