W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
iOS中,我們使用的大部分都是MVC架構(gòu)。雖然MVC的層次明確,但是由于功能日益的增加、代碼的維護(hù),使得更多的代碼被寫在了Controller中,這樣Controller就顯得非常臃腫。為了給Controller瘦身,后來(lái)又從MVC衍生出了一種新的架構(gòu)模式MVVM架構(gòu)。
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層)。
首先我們簡(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ù)邏輯。
假設(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ù)邏輯。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: