ReactiveCocoa & MVVM 學習總結二

二. MVVMhtml

1. 什麼是MVVMreact

From: https://github.com/ReactiveCocoa/ReactiveViewModel#model-view-viewmodelios


MVVM是指 Model-View-ViewModel的簡稱,與MVC的一個主要區別是 view 擁有view model。這個與MVC不同,MVC中應該是controller擁有view。同時,view model 中應該不包含相關view的代碼,這樣以來,view model就是獨立的,能夠與任何view進行綁定。git

A view model is like an adapter for the model that makes it suitable for presentation. The view model is also where presentation behavior goes.github

From: http://cocoasamurai.blogspot.fr/2013/03/basic-mvvm-with-reactivecocoa.html數據庫


MVVM是微軟提出的,基於MVC的一種設計模式,更準確來講是基於Martin Fowlers Presentation Model (http://martinfowler.com/eaaDev/PresentationModel.html)。在MVVM中,與MVC同樣也是有3個組件,可是與MVC仍是有區別的。在MVVM中,咱們傾向於把ViewController和View放在一個總體中,把他們當作MVVM的View組件。與MVC最主要的不一樣之處在於,咱們引入了View Model,View Model會經過observer的方式把更新推送到View組件中,通常來講observer是經過RAC來實現的。在MVVM中,View Model封裝了用於View綁定的數據/屬性和一些驗證邏輯以及操做。設計模式

From: http://www.teehanlax.com/blog/model-view-viewmodel-for-ios/網絡


在MVVM中,the view 和 view controller正式鏈接在一塊兒被做爲一個總體來對待, View。View仍然不會持有model,他們會持有view model。view model能夠作不少事情,好比驗證用戶數據的邏輯,view的展現邏輯,發出網絡請求,以及其餘各類操做。可是view model有一件事不能作,不能持有任何對view的引用,總之,view model要作到在iOS和OS X都能直接被使用(換句話說,不能 #import UIKit.h)。mvc

當你看到上圖時,你會發現我只是使用了兩個比較含糊的動詞 「notify」 和 「update」,可是並無說明如何去實現。儘管能夠像MVC中那樣使用KVO來實現,可是很快你就會發現這樣會使代碼變得不可控。所以,在實際中,咱們最好使用ReactiveCocoa把MVVM中各個部分組合在一塊兒。mvvm

在我本身看來,View Model主要是用來獲取data(如網絡請求讀取數據庫等),對data進行操做(如驗證轉換格式等),以及控制用於View綁定的數據和屬性,總之,就是各類邏輯操做均可以放到這裏處理,最終要作到的就是把數據變爲可展現的格式,用於UI進行填充。注意,不要有與UIView相關的代碼。

2. MVVM的優點

From: https://github.com/ReactiveCocoa/ReactiveViewModel#model-view-viewmodel

1) View models are testable.  (脫離UI以後,測試起來會很是簡單方便,以前MVC中那些好比展現效果之類的測試也很容易就能夠作到,並且UI的更改不會影響測試case的開發)

2) View models can be used like models. (這裏主要的意思是,view model的操做更加簡單,好比能夠進行copy和序列化操做,這個用來作相似恢復UI很是有用途)

3) View models are (mostly) platform-agnostic. (大部分狀況下,甚至能夠作到平臺無關,好比跨iPhone/iPad/Mac)

4) Views and view controllers are simpler. (把邏輯放到view model以後,view/view controller就會變得很簡潔清晰)

3. 在MVVM中View Controller的職責

綁定View與View Model,響應View Model,調用View Model相應的方法,負責View和window的轉換,佈局UI,動畫,設備旋轉,展現UI

4. From: http://www.sprynthesis.com/2014/12/06/reactivecocoa-mvvm-introduction/

1) view-model 做爲view controller的一個屬性存在,view controller 瞭解 view-model和它的public屬性,可是view-model對view controller卻一無所知。

2) view-model 應該只暴露儘量少的信息給view controller,view controller也根本不須要關心view-model是如何獲取數據的,view-model能夠經過網絡或者驗證或者計算或者以前已經存在的數據,這些對view controller都是透明的,它只關心他須要的必須的那些數據。

3) 沒必要使用一個view-model來負責屏幕上全部的數據,可使用child view-models來負責那些很小而且容易封裝的區域的數據。這在那種有view重用機制(例如 table view cell)的地方很是有用。而對於那些不是可複用的view,則沒有必要使用child view-models,只須要把view-model直接傳遞給那個view便可,這種方式還有一種額外的好處,就可讓全部的subviews的更新保持同步,因爲他們綁定了同一個view-model,只要view-model中對應的屬性發生變化,全部的subviews都會被update。注: 這個也是我以前很困惑的地方,在作以前公司的項目時,我就曾經遇到相似的問題,當時的解決方式是本身實現了一套KVO機制,不過問題也很明顯,就是耦合很重,同時內存處理上也很麻煩。

5. https://github.com/ReactiveCocoa/ReactiveViewModel,這個開源項目默認提供了一個RVMViewModel來做爲view model的基類,可是我一直很困惑這個類的用途。參考了一下ash的書,他主要是用RVMViewModel中的active屬性來表示view model是否處於激活狀態,避免在view model init的時候發起網絡請求,而是在view model處於active的時候才發起:



可是這種用法,感受不是很優雅,使用RACCommand去實現的話,能夠比這個要優雅不少,能夠參考,http://codeblog.shape.dk/blog/2013/12/05/reactivecocoa-essentials-understanding-and-using-raccommand/,這篇文章裏的思想以及我以前的博客中的介紹和github上的demo。網友Sam lau也給我提供了一個他寫的小項目做爲參考,對學習RAC很是有好處,https://github.com/samlaudev/DesignerNewsForObjc

參考資料:

相關文章
相關標籤/搜索