什么是MVVM

2023-06-28 16:35 更新

為什么使用MVVM

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

MVVM分別指什么

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

M----->Model層:請求的原始數(shù)據(jù)
V----->View層:視圖展示,由ViewController來控制
VM---->ViewModel層:負責業(yè)務處理和數(shù)據(jù)轉化

簡單來說,就是API請求完數(shù)據(jù),解析成Model,之后在ViewModel中轉化成能夠直接被視圖層使用的數(shù)據(jù),交付給前端(View層)。


MVVM與MVC的不同

首先我們簡化一下MVC的架構模式圖:


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



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

對這種MVVM架構中的"更新"機制,我們沒有什么概念。實際上也沒有什么關于MVVM的東西迫使你使用特定的機制來更新視圖模型或視圖。但在本書的范圍內,我們將使用ReactiveCocoa來做處理這個。

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

舉一個具體的例子:

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

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

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

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

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


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號