MVC未檩、MVVM戴尸、RaectiveCocoa的總結(jié)

本文所有Demo地址:https://github.com/iOSaFei/MVC-MVVM-ReactiveCocoa-

真的理解MVC嗎?

從剛開始做iOS項(xiàng)目的時(shí)候讹挎,就知道要使用MVC校赤,雖然不懂為什么但總是會建三個(gè)文件夾。寫的東西多了見的東西多了才發(fā)現(xiàn)還欠MVC一次總結(jié)筒溃。

為了有權(quán)威性先擺上斯坦福大學(xué)公開課上的一幅圖:


F482D2FF-29BD-4B9D-9AD7-C8B8EADCD133.gif

這幅圖需要注意以下幾點(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ù)雜留給自己哥谷,把簡潔留給他人。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末麻献,一起剝皮案震驚了整個(gè)濱河市们妥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勉吻,老刑警劉巖监婶,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異齿桃,居然都是意外死亡惑惶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門短纵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來带污,“玉大人,你說我怎么就攤上這事香到∮慵剑” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵悠就,是天一觀的道長千绪。 經(jīng)常有香客問我,道長理卑,這世上最難降的妖魔是什么翘紊? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮藐唠,結(jié)果婚禮上帆疟,老公的妹妹穿的比我還像新娘。我一直安慰自己宇立,他們只是感情好踪宠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妈嘹,像睡著了一般柳琢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上润脸,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天柬脸,我揣著相機(jī)與錄音,去河邊找鬼毙驯。 笑死倒堕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的爆价。 我是一名探鬼主播垦巴,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼媳搪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骤宣?” 一聲冷哼從身側(cè)響起秦爆,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎憔披,沒想到半個(gè)月后等限,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡活逆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年精刷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔗候。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怒允,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锈遥,到底是詐尸還是另有隱情纫事,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布所灸,位于F島的核電站丽惶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏爬立。R本人自食惡果不足惜钾唬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侠驯。 院中可真熱鬧抡秆,春花似錦、人聲如沸吟策。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檩坚。三九已至着撩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匾委,已是汗流浹背拖叙。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赂乐,地道東北人憋沿。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像沪猴,于是被迫代替她去往敵國和親辐啄。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容