iOS開(kāi)發(fā)--MVC設(shè)計(jì)模式

前言

最近一段時(shí)間在看斯坦福大學(xué)的iOS9視頻課程衷掷,斯坦福老頭在講解MVC時(shí)我收獲良多。參考Swift編程(四):深入淺出MVC模式一文拐袜,在觀看完Applyiing MVC一節(jié)視頻后钧嘶,我也試著總結(jié)一下該節(jié)視頻的關(guān)鍵知識(shí)點(diǎn)幔亥。

MVC設(shè)計(jì)模式

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫(xiě)洒琢,一種軟件設(shè)計(jì)典范秧秉,用一種業(yè)務(wù)邏輯、數(shù)據(jù)衰抑、界面顯示分離的方法組織代碼象迎,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí)呛踊,不需要重新編寫(xiě)業(yè)務(wù)邏輯砾淌。(來(lái)自百度百科)

MVC簡(jiǎn)介

從本質(zhì)上來(lái)說(shuō),MVC模型將應(yīng)用或代碼分割成三個(gè)不同的“陣營(yíng)”:

模型(Model)

The Model camp is what your application does.
Nothing about how it‘s drawn on screen or how it's displayed.

解釋:模型是你的應(yīng)用是什么谭网,是程序的行為的合集汪厨。

視圖(View)

The View, you can think of as your controller's minions.The things that the controller's gonna user to put things on sceen.

解釋:視圖是控制器的仆從,那些controller想要在屏幕上展示的界面控件愉择,如UIButton劫乱、UILabel、UITableView等锥涕,用于展示Model的信息要拂。

控制器(Controller)

The controller is how your model is displayed on screen.It's kind of the how.This is basically all your UI logic, goes into your controller.

解釋:控制器是控制你的模型如何在界面上展示的工具。關(guān)鍵在于如何進(jìn)行展示站楚,控制器主要包含了你的界面邏輯以及界面的跳轉(zhuǎn)脱惰。

MVC三個(gè)“陣營(yíng)”運(yùn)轉(zhuǎn)的機(jī)制

三個(gè)“陣營(yíng)”交互的關(guān)鍵在于,哪些行為是允許的窿春,哪些行為是不允許的拉一,以及什么時(shí)候進(jìn)行交互采盒,如何在iOS中實(shí)現(xiàn),如何促進(jìn)各“陣營(yíng)”的交流蔚润。

MVC

解釋:
如圖磅氨,斯坦福老頭在中心繪制了一個(gè)’Y‘字的圖案,在’Y‘的下方有兩條黃色的線條嫡纠,表示兩邊是不相通的烦租,上方兩條白色的線表示兩邊是可以相通的。
注意:三個(gè)“陣營(yíng)”交互的方向總是固定的除盏。

控制器(Controller)& 模型(Model)的通信

控制器(Controller)-> 模型(Model)

Controller知道Model所有的屬性和方法叉橱,可以調(diào)用Model所有的方法。Controller能完全控制Model者蠕,這是因?yàn)閏ontroller的任務(wù)就是展示給用戶看Model的信息窃祝,或者從用戶處獲得信息以及更新Model的信息。
見(jiàn)上圖踱侣,綠色箭頭和白色虛線表示Controller可以完全控制Model粪小。

模型(Model)-> 控制器(Controller)

一般情況下,Model是不能與Controller通信的抡句。為了實(shí)現(xiàn)Model如何通知Controller它的數(shù)據(jù)發(fā)生變化探膊,iOS采用Notification(廣播)KVO(鍵值對(duì)觀察)的形式。廣播的機(jī)制是:Model將自己設(shè)立為廣播中心待榔,通過(guò)發(fā)送廣播突想,通知那些對(duì)數(shù)據(jù)變化有監(jiān)聽(tīng)的廣播站,然后將Controller設(shè)置成接收廣播的設(shè)備究抓。由此可看出猾担,Model并不會(huì)直接對(duì)Controller進(jìn)行通知,它只是通知那些想知道的對(duì)象刺下。

控制器(Controller)& 視圖(View)的通信

控制器(Controller)-> 視圖(View)

Controller希望展示Model的信息绑嘹,需要使用到它的“仆從”(View)。大部分情況下橘茉,從Controller到View的交互方式都是通過(guò)Outlet來(lái)實(shí)現(xiàn)的工腋。
見(jiàn)上圖,帶有Outlet字眼的綠色箭頭和白色虛線表示Controller可以完全控制View畅卓。

視圖(View)-> 控制器(Controller)

從View到Controller的通信的問(wèn)題在于擅腰,所有的控件都是一個(gè)通用的類型,例如UIButton或UILabel翁潘,對(duì)于這些控件來(lái)說(shuō)趁冈,它們不能真正地了解調(diào)用它們的Controller,故它們只能以盲目的方式與Controller通信。因此Controller與View之間的通信是有限制的渗勘。

  • Target-Action模式
    只需通過(guò)Ctrl + 左鍵拖拉控件到Controller,此時(shí)Controller被設(shè)定成target沐绒,在Controller會(huì)生成一個(gè)返回類型為IBAction的方法。當(dāng)View向Controller通知有事件在它身上觸發(fā)時(shí)旺坠,view根本不需要知道它通知的Controller是什么樣的乔遮,只需簡(jiǎn)單地調(diào)用該方法即可,
    見(jiàn)上圖取刃,帶有action字眼的短小的黃色雙箭頭蹋肮,一端黏在View上,一端大概地指向Controller璧疗。

  • delegate(委托)和 dataSource(數(shù)據(jù)源)協(xié)議
    delegate(委托)
    有些時(shí)候坯辩,發(fā)生在View上的事件比較復(fù)雜,通過(guò)Target-Action模式無(wú)法通知給Controller足夠的信息病毡。如tableView的滾動(dòng)濒翻、某一行被點(diǎn)擊等屁柏,這時(shí)候view可以將Controller設(shè)置為它的delegate啦膜,委托Controller來(lái)處理這些復(fù)雜的事件。通常這些委托方法的名字會(huì)帶有will淌喻、should僧家、did等關(guān)鍵字。
    dataSource(數(shù)據(jù)源)協(xié)議
    疑問(wèn):我們知道裸删,任何View都不能包含它們所展示的Model八拱,那么在沒(méi)有Model的情況下,View是如何進(jìn)行展示的涯塔?
    解釋:除了上面的delegate(委托)協(xié)議肌稻,還有另外一種協(xié)議——dataSource(數(shù)據(jù)源)協(xié)議。dataSource協(xié)議的方法不帶will匕荸、should爹谭、did等關(guān)鍵字。借助這些dataSource協(xié)議方法榛搔,View通過(guò)詢問(wèn)Controller诺凡,而Controller從Model中獲得數(shù)據(jù),從而View可以獲得需要顯示的數(shù)據(jù)践惑,以及根據(jù)數(shù)據(jù)來(lái)決定如何顯示腹泌。

模型(Model)& 視圖(View)的通信

Model和View是相互獨(dú)立的,所以它們之間完全不可能產(chǎn)生直接交互尔觉。對(duì)于那些完全和界面獨(dú)立的Model來(lái)說(shuō)凉袱,View只是Controller的仆從,Model和View之間的交互是完全沒(méi)有意義的侦铜,因此在實(shí)際設(shè)計(jì)中也不允許這樣做绑蔫。

參考鏈接

Swift編程(四):深入淺出MVC模式

被誤解的 MVC 和被神化的 MVVM

Developing-iOS-9-Apps-with-Swift-lecture2.Applying MVC

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末运沦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子配深,更是在濱河造成了極大的恐慌携添,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篓叶,死亡現(xiàn)場(chǎng)離奇詭異烈掠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)缸托,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門左敌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人俐镐,你說(shuō)我怎么就攤上這事矫限。” “怎么了佩抹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵叼风,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我棍苹,道長(zhǎng)无宿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任枢里,我火速辦了婚禮孽鸡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栏豺。我一直安慰自己彬碱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布奥洼。 她就那樣靜靜地躺著巷疼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溉卓。 梳的紋絲不亂的頭發(fā)上皮迟,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音桑寨,去河邊找鬼伏尼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尉尾,可吹牛的內(nèi)容都是我干的爆阶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辨图!你這毒婦竟也來(lái)了班套?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤故河,失蹤者是張志新(化名)和其女友劉穎吱韭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鱼的,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡理盆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凑阶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猿规。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宙橱,靈堂內(nèi)的尸體忽然破棺而出姨俩,到底是詐尸還是另有隱情,我是刑警寧澤师郑,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布环葵,位于F島的核電站,受9級(jí)特大地震影響呕乎,放射性物質(zhì)發(fā)生泄漏积担。R本人自食惡果不足惜陨晶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一猬仁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧先誉,春花似錦湿刽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至铃芦,卻和暖如春雅镊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刃滓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工仁烹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咧虎。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓卓缰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子征唬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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