本文翻譯自MVVM Tutorial with ReactiveCocoa
你也許在Twitter上看過這么一則笑話"iOS Architecture,where MVC stands for Massive View Controller".
這是關(guān)于iOS開發(fā)者的笑話,然而你在開發(fā)的過程中也會遇到這樣的問題:厚重且難以維護的view controller.
本文將討論應(yīng)用的另一種架構(gòu)Model-View-ViewModel(MVVM).得益于ReactiveCocoa,MVVM提供了MVC的可替代類型來減輕view controllers.
通過本文的教程,你將編寫一個簡單的Flickr搜索app,如下圖所示:
編寫之前,先來腦補些基礎(chǔ)知識!
ReactiveCocoa簡介
本文主要講解MVVM,而且假定你已經(jīng)對ReactiveCocoa有所了解.如果你還沒用過ReactiveCocoa,那么推薦你看看以前的教程來了解下.
如果你想要復(fù)習(xí)下ReactiveCocoa的知識,我來小小總結(jié)一下.
ReactiveCocoa的核心為signals即RACSignal類.Signals發(fā)出三種類型的事件流:next葱轩、completed、和error.
通過此模式,ReactiveCocoa可以用來替代delegate藐握、target-action靴拱、key-value observing等模式.
通過signal API創(chuàng)建的代碼更加統(tǒng)一且易讀.但ReactiveCocoa真正強大之處在于通過這些信號源能進(jìn)行更多高級操作.這些操作能在相當(dāng)簡潔高雅的操作下執(zhí)行復(fù)雜的篩選、轉(zhuǎn)換猾普、信號協(xié)調(diào)等.
在MVVM中,ReactiveCocoa扮演著重要角色.它提供ViewModel和View之間的綁定操作.MVVM介紹
Model-View-ViewModel(MVVM)設(shè)計模式通俗講,是個UI設(shè)計模型.它是MV設(shè)計模式大家庭中的一員,MV模式還包括Model View Controller(MVC)和Model View Presenter等等.
這些模式的業(yè)務(wù)邏輯和UI邏輯相分離,以使程序易于開發(fā)和測試.
為了更好地理解MVVM,需要來了解下它的先輩.
MVC為首個UI設(shè)計模式,可以追隨到Smalltalk language of the 1970s.下圖展示了MVC模型的元素及結(jié)構(gòu):
此模式將UI分割成Model(用來代表程序的狀態(tài))與View(UI控件)和Controller(用來處理用戶交互以及更新model模型)
MVC很大的一個問題是它相當(dāng)混亂.概念聽起來很好,但當(dāng)人們實現(xiàn)它時,Model袜炕、View、Controller之間看似圓形的關(guān)系,卻很容易混為一壇,造成換亂.
最近Martin Fowler介紹了MVC模型的演變Presentation Model,并通過微軟來推廣和使用MVVM.
這種模型的核心為ViewModel:用來呈現(xiàn)應(yīng)用UI狀態(tài)的model的一種.
它包含UI控件的屬性狀態(tài).例如當(dāng)前text field里面的輸入內(nèi)容初家、一個特殊的按鈕是否能用.而且還能提供view上的交互動作,例如按鈕的點擊和手勢.
ViewModel可以理解為model-of-the-view.
MVVM的三個組件之間的關(guān)系同MVC相似,遵從以下準(zhǔn)則:
- View有一個ViewModel的引用,不可逆轉(zhuǎn).
2 ViewModel有一個相應(yīng)的Model引用,不可逆轉(zhuǎn).
如果你不遵從以上準(zhǔn)則,將在使用MVVM時出錯.
這種設(shè)計模式有以下兩個優(yōu)點:
- 輕Views:你的UI邏輯都在ViewModel里從而使view變得很輕.
- 測試:你能夠在沒有View的情況下運行程序,大大增強了可測試性.
這里你也許會有個疑問.如果View有個對應(yīng)的ViewModel但卻不可逆轉(zhuǎn),那么ViewModel如何來更新View呢偎窘?
哈哈哈!這就是MVVM模型的所要解決的問題.
Girl學(xué)iOS100天 第16天