什么是MVVM

2023-06-28 16:35 更新

為什么使用MVVM

iOS中,我們使用的大部分都是MVC架構(gòu)。雖然MVC的層次明確,但是由于功能日益的增加、代碼的維護(hù),使得更多的代碼被寫在了Controller中,這樣Controller就顯得非常臃腫。為了給Controller瘦身,后來(lái)又從MVC衍生出了一種新的架構(gòu)模式MVVM架構(gòu)。

MVVM分別指什么

MVVM就是在MVC的基礎(chǔ)上分離出業(yè)務(wù)處理的邏輯到ViewModel層,即:

M----->Model層:請(qǐng)求的原始數(shù)據(jù)
V----->View層:視圖展示,由ViewController來(lái)控制
VM---->ViewModel層:負(fù)責(zé)業(yè)務(wù)處理和數(shù)據(jù)轉(zhuǎn)化

簡(jiǎn)單來(lái)說(shuō),就是API請(qǐng)求完數(shù)據(jù),解析成Model,之后在ViewModel中轉(zhuǎn)化成能夠直接被視圖層使用的數(shù)據(jù),交付給前端(View層)。


MVVM與MVC的不同

首先我們簡(jiǎn)化一下MVC的架構(gòu)模式圖:


在這里,Controller需要做太多得事情,表示邏輯、業(yè)務(wù)邏輯,所以代碼量非常的大。而MVVM:



在MVVM中,我們趨向于將view和view controller作為一個(gè)整體(這也解釋了為什么不稱它為MVVCVM),新的viewModel代替原來(lái)的viewController協(xié)調(diào)view與model之間的交互。

對(duì)這種MVVM架構(gòu)中的"更新"機(jī)制,我們沒有什么概念。實(shí)際上也沒有什么關(guān)于MVVM的東西迫使你使用特定的機(jī)制來(lái)更新視圖模型或視圖。但在本書的范圍內(nèi),我們將使用ReactiveCocoa來(lái)做處理這個(gè)。

ReactiveCocoa將會(huì)監(jiān)控?cái)?shù)據(jù)模型(model)的變化,并將這個(gè)變化映射到視圖模型(viewModel)的屬性上,執(zhí)行任意必要的業(yè)務(wù)邏輯。

舉一個(gè)具體的例子:

       假設(shè)我們的模型包含一個(gè)“日期”(用dateAdded表示),我們想要監(jiān)控這個(gè)“日期”的變化,來(lái)更新我們視圖模型(viewModel)的屬性dateAdded.模型(model)的屬性是一個(gè)NSDate的實(shí)例,但視圖模型(viewModel)中對(duì)應(yīng)的屬性是從它轉(zhuǎn)換過(guò)來(lái)的NSString。這種綁定看起來(lái)跟下面的代碼類似(在viewModel的初始化方法中進(jìn)行):

RAC(self, dateAdded) = [RACObserve(self.model,dateAdded) map:^(NSDate *date) {
    return [[ViewModel dateFormatter] stringFromDate:date];
}];

       dateFormatter是ViewModel的一個(gè)類方法,它緩存了一個(gè)NSDateFormatter實(shí)例以便復(fù)用(創(chuàng)建NSDateFormatter代價(jià)昂貴)。 接下來(lái),view controller 可以監(jiān)控viewModel的dateAdded屬性將它跟一個(gè)label進(jìn)行綁定。

RAC(self.label, text) = RACObserve(self.viewModel, dateAdded);

       現(xiàn)在,我們已經(jīng)將日期轉(zhuǎn)換為字符串到視圖模型的過(guò)程抽象出來(lái)了,在(viewModel)中我們可以為這個(gè)業(yè)務(wù)邏輯編寫單元測(cè)試。這個(gè)例子看起來(lái)簡(jiǎn)單,但就像我們看到的,它顯著地減少了你的視圖控制器中的業(yè)務(wù)邏輯。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)