IOS MVC詳解

1、MVC的理想模型

image.png

從字面意思來(lái)理解郭毕,MVC 即 Model View Controller(模型 視圖 控制器),是 Xerox PARC 在 20 世紀(jì) 80 年代為編程語(yǔ)言 Smalltalk-80 發(fā)明的一種軟件設(shè)計(jì)模式,至今已廣泛應(yīng)用于用戶交互應(yīng)用程序中许蓖。其用意在于將數(shù)據(jù)與視圖分離開(kāi)來(lái)窖杀。在 iOS 開(kāi)發(fā)中 MVC 的機(jī)制被使用的淋漓盡致漓摩,充分理解 iOS 的 MVC 模式,有助于我們程序的組織合理性入客。
MVC 的幾個(gè)明顯的特征和體現(xiàn):
1管毙、View 上面顯示什么東西,取決于 Model桌硫。
2夭咬、只要 Model 數(shù)據(jù)改了,View 的顯示狀態(tài)會(huì)跟著更改铆隘。

  • Models:?數(shù)據(jù)層卓舵,負(fù)責(zé)數(shù)據(jù)的處理和獲取的數(shù)據(jù)接口層。
  • Views: 展示層(GUI)膀钠,對(duì)于 iOS 來(lái)說(shuō)所有以 UI 開(kāi)頭的類(lèi)基本都屬于這層掏湾。
  • Controller:控制器層,它是 Model 和 View 之間的膠水或者說(shuō)是中間人肿嘲。一般來(lái)說(shuō)融击,當(dāng)用戶對(duì) View 有操作時(shí)它負(fù)責(zé)去修改相應(yīng) Model;當(dāng) Model 的值發(fā)生變化時(shí)它負(fù)責(zé)去更新對(duì)應(yīng) View雳窟。

如上圖所示尊浪,M和View應(yīng)該是完全隔離的,由C作為中間人來(lái)負(fù)責(zé)二者的交互封救,同時(shí)三者是完全獨(dú)立分開(kāi)的拇涤,這樣可以保證M和V的可測(cè)試性和復(fù)用性,但是一般由于C都是為特別的應(yīng)用場(chǎng)景下的M和V做中介者兴泥,所以很難復(fù)用工育。

2、MVC在iOS里面的實(shí)現(xiàn)

實(shí)際上在iOS里面MVC的實(shí)現(xiàn)方式很難做到如上所述的那樣搓彻,因?yàn)橛捎贏pple的規(guī)范如绸,一個(gè)界面的呈現(xiàn)都需要構(gòu)建一個(gè)viewcontroller嘱朽,而每個(gè)viewcontroller都帶有一個(gè)根view,這就導(dǎo)致C和V緊密耦合在一起構(gòu)成了iOS里面的C層怔接。
apple里面的MVC真正寫(xiě)起來(lái)大概如下圖所示:


image.png

3搪泳、iOS的MVC各層職責(zé)

controller層(VC):

1、生成view扼脐,然后組裝view
2岸军、響應(yīng)View的事件和作為view的代理
3、調(diào)用model的數(shù)據(jù)獲取接口瓦侮,拿到返回?cái)?shù)據(jù)艰赞,處理加工,渲染到view顯示
4肚吏、處理view的生命周期
5方妖、處理界面之間的跳轉(zhuǎn)

model層:

1、業(yè)務(wù)邏輯封裝
2罚攀、提供數(shù)據(jù)接口給controller使用
3党觅、數(shù)據(jù)持久化存儲(chǔ)和讀取
4、作為數(shù)據(jù)模型存儲(chǔ)數(shù)據(jù)

view層:

1斋泄、界面元素搭建杯瞻,動(dòng)畫(huà)效果,數(shù)據(jù)展示炫掐,
2魁莉、接受用戶操作并反饋視覺(jué)效果

4、MVC中M層實(shí)現(xiàn)的準(zhǔn)則

  • 定義的M層中的代碼應(yīng)該和V層和C層完全無(wú)關(guān)的卒废,也就是M層的對(duì)象是不需要依賴(lài)任何C層和V層的對(duì)象而獨(dú)立存在的沛厨。整個(gè)框架的設(shè)計(jì)最優(yōu)結(jié)構(gòu)是V層不依賴(lài)C層而獨(dú)立存在宙地,M層不依賴(lài)C層和V層獨(dú)立存在摔认,C層負(fù)責(zé)關(guān)聯(lián)二者,V層只負(fù)責(zé)展示宅粥,M層持有數(shù)據(jù)和業(yè)務(wù)的具體實(shí)現(xiàn)参袱,而C層則處理事件響應(yīng)以及業(yè)務(wù)的調(diào)用以及通知界面更新。三者之間一定要明確的定義為單向依賴(lài)秽梅,而不應(yīng)該出現(xiàn)雙向依賴(lài)抹蚀。下面是三層的依賴(lài)關(guān)系圖:


    image.png
  • M層要完成對(duì)業(yè)務(wù)邏輯實(shí)現(xiàn)的封裝,一般業(yè)務(wù)邏輯最多的是涉及到客戶端和服務(wù)器之間的業(yè)務(wù)交互企垦。M層里面要完成對(duì)使用的網(wǎng)絡(luò)協(xié)議(HTTP, TCP环壤,其他)、和服務(wù)器之間交互的數(shù)據(jù)格式(XML, JSON,其他)钞诡、本地緩存和數(shù)據(jù)庫(kù)存儲(chǔ)(COREDATA, SQLITE,其他)等所有業(yè)務(wù)細(xì)節(jié)的封裝郑现,而且這些東西都不能暴露給C層湃崩。所有供C層調(diào)用的都是M層里面一個(gè)個(gè)業(yè)務(wù)類(lèi)所提供的成員方法來(lái)實(shí)現(xiàn)。也就是說(shuō)C層是不需要知道也不應(yīng)該知道和客戶端和服務(wù)器通信所使用的任何協(xié)議接箫,以及數(shù)據(jù)報(bào)文格式攒读,以及存儲(chǔ)方面的內(nèi)容。這樣的好處是客戶端和服務(wù)器之間的通信協(xié)議辛友,數(shù)據(jù)格式薄扁,以及本地存儲(chǔ)的變更都不會(huì)影響任何的應(yīng)用整體框架,因?yàn)樘峁┙oC層的接口不變废累,只需要升級(jí)和更新M層的代碼就可以了邓梅。比如說(shuō)我們想將網(wǎng)絡(luò)請(qǐng)求庫(kù)從ASI換成AFN就只要在M層變化就可以了,整個(gè)C層和V層的代碼不變邑滨。下面是M層內(nèi)部層次的定義圖:


    image.png
  • M層如何和C層交互的問(wèn)題也需要考慮震放,因?yàn)镸層是不需要知道C層和V層的存在的,那么M層在業(yè)務(wù)處理完畢后如何去通知C層呢驼修?方法有很多種:
    1殿遂、我們可以為M層的通知邏輯定義Delegate協(xié)議,然后讓C層去實(shí)現(xiàn)這些協(xié)議乙各,然后M層提供一個(gè)delegate屬性來(lái)賦值處理業(yè)務(wù)通知的對(duì)象墨礁。
    2、我們也可以定義眾多的NSNotification或者事件總線耳峦,然后當(dāng)M層的業(yè)務(wù)處理完畢后可以發(fā)送通知恩静,并且在C層實(shí)現(xiàn)通知的處理邏輯。
    3蹲坷、我們可以用閉包回調(diào)或者接口匿名實(shí)現(xiàn)對(duì)象的形式來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯完成的通知功能驶乾。

總結(jié)來(lái)說(shuō):
M層不應(yīng)該是數(shù)據(jù)模型,放幾個(gè)屬性就完事了循签。而應(yīng)該是承載業(yè)務(wù)邏輯和數(shù)據(jù)存儲(chǔ)獲取的職責(zé)一層级乐。

5、MVC優(yōu)缺點(diǎn)

優(yōu)點(diǎn):
1县匠、代碼復(fù)用: 三個(gè)小模塊的V(cell/userInfoView)對(duì)外只暴露Set方法, 對(duì)M甚至C都是隔離狀態(tài), 復(fù)用完全沒(méi)有問(wèn)題. 三個(gè)大模塊的MVC也可以用于快速構(gòu)建相似的業(yè)務(wù)場(chǎng)景(大模塊的復(fù)用比小模塊會(huì)差一些, 下文我會(huì)說(shuō)明).
2风科、易拓展性: 當(dāng)模型,數(shù)據(jù)與控制器是相分離的時(shí)候乞旦,改變業(yè)務(wù)規(guī)則就變得很容易贼穆,數(shù)據(jù)的存儲(chǔ)可以隨意的遷移,因?yàn)槟P蛯?duì)控制器的接口是不變的兰粉,這樣界面仍然可以正確的展示故痊,界面UI也是可以任意改變,因?yàn)樗魂P(guān)心界面不會(huì)影響到其他.
3玖姑、可維護(hù)性: 各個(gè)模塊間職責(zé)分離, 哪里出錯(cuò)改哪里, 完全不影響其他模塊. 利于多人團(tuán)隊(duì)開(kāi)發(fā)
缺點(diǎn):
1愕秫、沒(méi)有區(qū)分業(yè)務(wù)邏輯和業(yè)務(wù)展示, 這對(duì)單元測(cè)試很不友好.
2浊仆、增加了系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)的復(fù)雜性。對(duì)于簡(jiǎn)單的界面豫领,嚴(yán)格遵循MVC抡柿,使模型、視圖與控制器分離等恐,會(huì)增加結(jié)構(gòu)的復(fù)雜性洲劣,并可能產(chǎn)生過(guò)多的更新操作,降低運(yùn)行效率课蔬。
3囱稽、視圖對(duì)模型數(shù)據(jù)的低效率訪問(wèn)。依據(jù)模型操作接口的不同二跋,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)战惊。對(duì)未變化數(shù)據(jù)的不必要的頻繁訪問(wèn),也將損害操作性能扎即。
4吞获、業(yè)務(wù)邏輯和業(yè)務(wù)展示強(qiáng)耦合: 可以看到, 有些業(yè)務(wù)邏輯(頁(yè)面跳轉(zhuǎn)/點(diǎn)贊/分享…)是直接散落在V層的, 這意味著我們?cè)跍y(cè)試這些邏輯時(shí), 必須首先生成對(duì)應(yīng)的V, 然后才能進(jìn)行測(cè)試. 顯然, 這是不合理的. 因?yàn)闃I(yè)務(wù)邏輯最終改變的是數(shù)據(jù)M, 我們的關(guān)注點(diǎn)應(yīng)該在M上, 而不是展示M的V.

參考博客

iOS MVC、MVVM谚鄙、MVP詳解 - 簡(jiǎn)書(shū) (jianshu.com)
深入分析MVC各拷、MVP、MVVM闷营、VIPER (juejin.cn)
iOS中MVC設(shè)計(jì)模式的優(yōu)缺點(diǎn)_dxm_8888的博客-CSDN博客_ios mvc優(yōu)點(diǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末烤黍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子傻盟,更是在濱河造成了極大的恐慌速蕊,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娘赴,死亡現(xiàn)場(chǎng)離奇詭異规哲,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)筝闹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)媳叨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人关顷,你說(shuō)我怎么就攤上這事∥涓#” “怎么了议双?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捉片。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么悯嗓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任猛们,我火速辦了婚禮,結(jié)果婚禮上螺捐,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好泌神,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著舞虱,像睡著了一般欢际。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矾兜,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天损趋,我揣著相機(jī)與錄音,去河邊找鬼椅寺。 笑死浑槽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的返帕。 我是一名探鬼主播括荡,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼溉旋!你這毒婦竟也來(lái)了畸冲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤观腊,失蹤者是張志新(化名)和其女友劉穎邑闲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體梧油,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苫耸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了儡陨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褪子。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖骗村,靈堂內(nèi)的尸體忽然破棺而出嫌褪,到底是詐尸還是另有隱情,我是刑警寧澤胚股,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布笼痛,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缨伊。R本人自食惡果不足惜摘刑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刻坊。 院中可真熱鬧枷恕,春花似錦、人聲如沸谭胚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)漏益。三九已至蛹锰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绰疤,已是汗流浹背铜犬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轻庆,地道東北人癣猾。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像余爆,于是被迫代替她去往敵國(guó)和親纷宇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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

  • 1蛾方、MVC 從字面意思來(lái)理解像捶,MVC 即 Modal View Controller(模型 視圖 控制器),是 X...
    北極點(diǎn)閱讀 377評(píng)論 0 2
  • 文章大綱 一桩砰、Spring mvc介紹二拓春、Spring mvc代碼實(shí)戰(zhàn)三、項(xiàng)目源碼下載四亚隅、參考文章 一硼莽、Sprin...
    故事愛(ài)人c閱讀 694評(píng)論 0 2
  • 一行疏、MVC 從字面意思來(lái)理解匆光,MVC 即 Model View Controller(模型 視圖 控制器),是 X...
    032c6843a285閱讀 20,515評(píng)論 21 46
  • 前言 今天有時(shí)間就剛好有想寫(xiě)關(guān)于這幾個(gè)名詞采幌,對(duì)于我來(lái)說(shuō),其實(shí)這么多名詞震桶、思想歸根到底就是要根據(jù)項(xiàng)目實(shí)際休傍、人員配置來(lái)...
    summer_七七閱讀 292評(píng)論 0 0
  • 背景 今天有時(shí)間就剛好有想寫(xiě)關(guān)于這幾個(gè)名詞柴墩,對(duì)于我來(lái)說(shuō)忙厌,其實(shí)這么多名詞、思想歸根到底就是要根據(jù)項(xiàng)目實(shí)際江咳、人員配置來(lái)...
    Vurtex閱讀 958評(píng)論 0 3