本文所有Demo地址:https://github.com/iOSaFei/MVC-MVVM-ReactiveCocoa-
真的理解MVC嗎?
從剛開始做iOS項(xiàng)目的時(shí)候讹挎,就知道要使用MVC校赤,雖然不懂為什么但總是會建三個(gè)文件夾。寫的東西多了見的東西多了才發(fā)現(xiàn)還欠MVC一次總結(jié)筒溃。
為了有權(quán)威性先擺上斯坦福大學(xué)公開課上的一幅圖:
這幅圖需要注意以下幾點(diǎn):
Model:數(shù)據(jù)模型,負(fù)責(zé)數(shù)據(jù)的獲取及存放沾乘,數(shù)據(jù)的獲取可能是網(wǎng)絡(luò)請求也可能是本地?cái)?shù)據(jù)庫訪問怜奖,存放是指數(shù)據(jù)解析之后放在Model中方便Controller提供給View使用。
View:視圖翅阵,負(fù)責(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ù)模塊與視圖模塊的分離。提高了程序的可維護(hù)性、可移植性短条、可擴(kuò)展性與可重用性导匣。
Model和Controller之間采用KVO和Notification通信,為什么不用Block和代理茸时?從技術(shù)上是可以的贡定,但是在MVC中,Model不需要知道被Controller持有可都,KVO和Notification在解耦和方面比Block要好缓待,但是Block很方便,使用全憑個(gè)人愛好渠牲。
Controller和View采用委托(代理和數(shù)據(jù)源)或target-action命斧,前者的典型UITableView,后者諸如UIButton等嘱兼。
知道了這些就可以用MVC寫東西了国葬,但是似乎Model這塊怎么寫還是不是那么的清楚?而且很容易寫成Massive View Controller 模式芹壕。就比如在Controller中直接使用AFNetwrking請求汇四、然后將請求的數(shù)據(jù)在Controller中解析成Model,這是最不推薦的一種寫法踢涌,AFNetworking如果不維護(hù)了呢通孽?這樣寫Controller里代碼增加了多少?
這里我給出一種MVC的Demo供大家借鑒睁壁,這里我將每個(gè)網(wǎng)絡(luò)請求都封裝成了一個(gè)類背苦。另外給出一個(gè)我看到并受益的觀點(diǎn):
1、將 UITableView 的 Data Source 分離到另外一個(gè)類中潘明。
2行剂、將數(shù)據(jù)獲取和轉(zhuǎn)換的邏輯分別到另外一個(gè)類中。
3钳降、將拼裝控件的邏輯厚宰,分離到另外一個(gè)類中。
MVVM的出現(xiàn)
MVVM是MVC發(fā)展的產(chǎn)物遂填,從命名中可以看出這種模式減少了Controller的職責(zé)铲觉。
在這種模式下:
Model的職責(zé)依然是獲取數(shù)據(jù),但不會去負(fù)責(zé)給View提供數(shù)據(jù)了吓坚。
View-Model負(fù)責(zé)將Model獲取的數(shù)據(jù)解析成View所需要的數(shù)據(jù)模型撵幽。
而此時(shí)Controller則不再需要負(fù)責(zé)Model轉(zhuǎn)換的邏輯了(事實(shí)上、上面MVC的demo中我就已經(jīng)優(yōu)化了這一點(diǎn)礁击、因?yàn)镸VC并沒有指出數(shù)據(jù)解析應(yīng)該放在哪里)盐杂。
view的任務(wù)就是呈現(xiàn)由view-model提供的數(shù)據(jù)逗载。
如果只有以上這些不同,你可能會覺得這跟MVC根本沒什么差異况褪。MVVM 在使用過程中撕贞,通常還會利用雙向綁定技術(shù):Model 變化時(shí),ViewModel 會跟著自動改變测垛,而 ViewModel 變化也會引起 View 自動變化捏膨。
iOS 中,可以使用 KVO 或 Notification 實(shí)現(xiàn)食侮。而且号涯,GitHub 開源的 ReactiveCocoa 可以很優(yōu)美的實(shí)現(xiàn)這種綁定。當(dāng)然ReactiveCocoa還可以用在很多地方锯七。
我會給出兩個(gè)Demo链快,一個(gè)是使用KVO實(shí)現(xiàn)的MVVM,另一個(gè)使用RAC實(shí)現(xiàn)的MVVM眉尸。
這些Demo都很清晰明了今艺,這里就不貼代碼了男窟,去Github上下載的時(shí)候記得點(diǎn)個(gè)贊哦洪燥!
這些Demo很能說明問題轻姿,但畢竟不是一個(gè)整體的項(xiàng)目、沒有展示RAC如何使用袱蜡,我過段時(shí)間會使用MVVM+RAC重寫我以前上線的一個(gè)項(xiàng)目:玩轉(zhuǎn)西郵丝蹭,到時(shí)候也會放到Github上。
簡單介紹一下RAC
ReactiveCocoa(簡稱為RAC),是由Github開源的一個(gè)應(yīng)用于iOS和Mac OS開發(fā)的新框架坪蚁。
ReactiveCocoa作用:
我們在iOS開發(fā)過程中奔穿,代理、KVO敏晤、點(diǎn)擊事件等都可以通過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ù)值會同時(shí)發(fā)生變化扶平。
關(guān)于這兩個(gè)思想我也寫了Demo可以一并下載,關(guān)于思想的Demo參考自:http://www.reibang.com/p/87ef6720a096中的代碼(指明出處是最起碼的尊重)蔬蕊。
建議下載本文所有Demo结澄,地址:https://github.com/iOSaFei/MVC-MVVM-ReactiveCocoa-
把復(fù)雜留給自己哥谷,把簡潔留給他人。