MVC、MVVM、RaectiveCocoa的总结
本文所有Demo地址:https://github.com/iOSaFei/MVC-MVVM-ReactiveCocoa-
真的理解MVC嗎?
從剛開始做iOS項目的時候,就知道要使用MVC,雖然不懂為什么但總是會建三個文件夾。寫的東西多了見的東西多了才發(fā)現(xiàn)還欠MVC一次總結(jié)。
為了有權(quán)威性先擺上斯坦福大學(xué)公開課上的一幅圖:
這幅圖需要注意以下幾點:
Model:數(shù)據(jù)模型,負責(zé)數(shù)據(jù)的獲取及存放,數(shù)據(jù)的獲取可能是網(wǎng)絡(luò)請求也可能是本地數(shù)據(jù)庫訪問,存放是指數(shù)據(jù)解析之后放在Model中方便Controller提供給View使用。
View:視圖,負責(zé)UI的展示,它是需要數(shù)據(jù)的。
Controller:控制器,協(xié)調(diào)數(shù)據(jù)和視圖(將Model中的數(shù)據(jù)提供給視圖)。
Controller持有Model和View,Model和View之間不應(yīng)該持有、也就是Model不能直接和View通信,這體現(xiàn)出了MVC數(shù)據(jù)模塊與視圖模塊的分離。提高了程序的可維護性、可移植性、可擴展性與可重用性。
Model和Controller之間采用KVO和Notification通信,為什么不用Block和代理?從技術(shù)上是可以的,但是在MVC中,Model不需要知道被Controller持有,KVO和Notification在解耦和方面比Block要好,但是Block很方便,使用全憑個人愛好。
Controller和View采用委托(代理和數(shù)據(jù)源)或target-action,前者的典型UITableView,后者諸如UIButton等。
知道了這些就可以用MVC寫東西了,但是似乎Model這塊怎么寫還是不是那么的清楚?而且很容易寫成Massive View Controller 模式。就比如在Controller中直接使用AFNetwrking請求、然后將請求的數(shù)據(jù)在Controller中解析成Model,這是最不推薦的一種寫法,AFNetworking如果不維護了呢?這樣寫Controller里代碼增加了多少?這里我給出一種MVC的Demo供大家借鑒,這里我將每個網(wǎng)絡(luò)請求都封裝成了一個類。另外給出一個我看到并受益的觀點:
1、將 UITableView 的 Data Source 分離到另外一個類中。
2、將數(shù)據(jù)獲取和轉(zhuǎn)換的邏輯分別到另外一個類中。
3、將拼裝控件的邏輯,分離到另外一個類中。
MVVM的出現(xiàn)
MVVM是MVC發(fā)展的產(chǎn)物,從命名中可以看出這種模式減少了Controller的職責(zé)。
在這種模式下:
Model的職責(zé)依然是獲取數(shù)據(jù),但不會去負責(zé)給View提供數(shù)據(jù)了。
View-Model負責(zé)將Model獲取的數(shù)據(jù)解析成View所需要的數(shù)據(jù)模型。
而此時Controller則不再需要負責(zé)Model轉(zhuǎn)換的邏輯了(事實上、上面MVC的demo中我就已經(jīng)優(yōu)化了這一點、因為MVC并沒有指出數(shù)據(jù)解析應(yīng)該放在哪里)。
view的任務(wù)就是呈現(xiàn)由view-model提供的數(shù)據(jù)。
如果只有以上這些不同,你可能會覺得這跟MVC根本沒什么差異。MVVM 在使用過程中,通常還會利用雙向綁定技術(shù):Model 變化時,ViewModel 會跟著自動改變,而 ViewModel 變化也會引起 View 自動變化。
iOS 中,可以使用 KVO 或 Notification 實現(xiàn)。而且,GitHub 開源的 ReactiveCocoa 可以很優(yōu)美的實現(xiàn)這種綁定。當然ReactiveCocoa還可以用在很多地方。
我會給出兩個Demo,一個是使用KVO實現(xiàn)的MVVM,另一個使用RAC實現(xiàn)的MVVM。
這些Demo都很清晰明了,這里就不貼代碼了,去Github上下載的時候記得點個贊哦!
這些Demo很能說明問題,但畢竟不是一個整體的項目、沒有展示RAC如何使用,我過段時間會使用MVVM+RAC重寫我以前上線的一個項目:玩轉(zhuǎn)西郵,到時候也會放到Github上。
簡單介紹一下RAC
ReactiveCocoa(簡稱為RAC),是由Github開源的一個應(yīng)用于iOS和Mac OS開發(fā)的新框架。
ReactiveCocoa作用:
我們在iOS開發(fā)過程中,代理、KVO、點擊事件等都可以通過RAC處理。
從上面MVVM+KVO的Demo中可以看出RAC非常符合高聚合,低耦合的思想。
ReactiveCocoa的思想:
ReactiveCocoa結(jié)合了函數(shù)式編程思想和響應(yīng)式編程思想,所以ReactiveCocoa被描述為函數(shù)響應(yīng)式編程(FRP)框架。
函數(shù)式編程思想:是把操作盡量寫成一系列嵌套的函數(shù)或者方法調(diào)用。
響應(yīng)式編程思想:如果 a = b + c ; b 或者 c 的值變化后,a 的數(shù)值會同時發(fā)生變化。
關(guān)于這兩個思想我也寫了Demo可以一并下載,關(guān)于思想的Demo參考自:http://www.jianshu.com/p/87ef6720a096中的代碼(指明出處是最起碼的尊重)。
本文所有Demo地址:https://github.com/iOSaFei/MVC-MVVM-ReactiveCocoa-
把復(fù)雜留給自己,把簡潔留給他人。
總結(jié)
以上是生活随笔為你收集整理的MVC、MVVM、RaectiveCocoa的总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React-Native带你一步一步实现
- 下一篇: [QT]制作软件级屏保