為MVC瘦身——iOS的MVVM架構與ReactiveCocoa架構,mvvmreactivecocoa

來源:互聯網
上載者:User

為MVC瘦身——iOS的MVVM架構與ReactiveCocoa架構,mvvmreactivecocoa
MVC = Massive View Controller ?

有笑話稱MVC為重量級的試圖控制器。仔細一想,確實存在這個問題。以UITableViewController和UITableView舉個例子。
一般情況下,我們沒有必要建立一個自訂的tableview繼承自UITableView。這意味著View的模組幾乎為空白。(在相當多的時候,view也僅是一個xib檔案或者一堆代碼用來描述控制面板和控制項的位置而已)。至於Model,十分類似於JavaBean,一個類,若干屬性和constructor足矣。而大量的商務邏輯的處理被放在View Controller中。

MVC的目的與不足

最初我們希望,能夠把視圖、模型分離開來,並用一個視圖控制器去管理兩者。然而,理想很豐滿,現實很骨感。實際編程時,遇到種種奇奇怪怪的情況。
例如:

要知道,視圖控制器,是用來管理檢視的。讓它處理這些亂七八糟的邏輯,是不是顯得太臃腫了,管了太多自己不應該負責的事情。
更何況,幾乎所有的視圖和視圖控制器都是一一對應關係。既然視圖離不開控制器,控制器也必須維護一個自己管理的視圖,為什麼不乾脆把他們結合在一起?

新的設計結構——MVVM

簡單來說。MVVM就是一個經過最佳化的MVC,這意味著它可以相容,也本質上還是一個MVC結構。
所謂的MVVM架構,就是把那些Controller不應該負責的內容分離出來。單獨作為一塊。用MVVM的術語來說,就是把“將 Model 資料轉換為 View 可以呈現的東西”這一可能極為複雜的過程剝離出來,放到ViewModel對象中。至於ViewController,嗯,你就負責管好你的視圖吧。別的東西你也別負責了。(因此,網路請求也應該被剝離開來,放入ViewModel中,實際上一次網路請求,只不過是將一些不在本機存放的模型,從Json轉換為可供View直接展示的資料)。
不管是從字面(ViewModel)還是從它的具體功能以及實現來理解,視圖模型(ViewModel)依然是一個模型(Model),它為View提供了可以拿來使用的資料,也從模型(Model)提取資料並加以轉化處理。

以一個簡單的鏈狀結構表示MVVM架構就是
View/ViewController ————> ViewModel ————> Model
這裡ViewController對象直接持有一個ViewModel對象。ViewModel對象又直接持有Model對象。箭頭不能被反向(這是MVVM架構的基本要求)。
這樣導致了一個問題,ViewModel發生變化的時候怎麼通知ViewController並且相應的改變View呢?這就是ReactiveCocoa架構要乾的事情了。Model的變化怎麼通知ViewModel呢?額。。。。。Model需要變嗎?額。。。一定非得要變的話,繼續用ReactiveCocoa不就行了麼。

ReactiveCocoa是何方神聖?

以C語言代碼舉個例子

    int a = 1;    int b = 2;    int c = a + b;    printf("c = %d",c);

顯然輸出結果是“c = 3”。
如果改變一下代碼,增加一行。

    int a = 1;    int b = 2;    int c = a + b;    a++;    printf("c = %d",c);

顯然輸出結果依然是“c = 3”。
如果我們希望c永遠等於a和b的和,注意是永遠等於。那麼目前看來唯一的方法是每次a和b發生變化的時候重新執行c = a + b。這樣的操作麻煩透了,幸運的是,iOS開發中,OC提供了KVO機制,而ReactiveCocoa架構利用了這個機制,並且進行了各種各樣的拓展。

ReactiveCocoa架構有多強?

簡單來說,試想一下:一個電路中有電源、開關,還有若干個小燈泡串聯在一起。斷開開關,所有的燈泡直接熄滅,多麼簡單的一件事!因為所有燈泡的亮暗直接依賴於開關的狀態。而十個人居住在十個房間裡,某個人起床時必須挨個通知其他九人:“我起床了”。What the huck?

舉一個實際開發的例子。假設有一個註冊介面,只有當輸入的使用者名稱密碼滿足某種邏輯的時候,註冊按鈕才會變為可用狀態。通常我們需要實現文字框的代理函數,對於每一次文字變動,執行判斷函數再去修改按鈕的狀態。

在ReactiveCocoa這種動態、響應式架構下,我們要做的,就是把button的enabled屬性和username.isValid && password.isValid綁定起來就可以了。

這樣的邏輯實在是太棒了,在下一章中,我們一起探索ReactiveCocoa架構的實際使用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.