Stanford iOS 8 公開課筆記 <二> -- MVC模式

? ? ? ? ? ?

綜述:

MVC模式 --即 Model液肌、View、Controller焰络,是20世紀(jì)80年代戴甩,Xerox PARC 為程序語言 Smalltalk 發(fā)明的一種軟件設(shè)計模式。

Xerox Palo Alto Research Center闪彼,簡稱Xerox PARC甜孤,即施樂帕克研究中心,是施樂公司所成立的最重要的研究機(jī)構(gòu),帕克成立于1970年缴川,位于加利福尼亞州的帕洛阿圖市(Palo Alto)茉稠,坐落在山坡上,而山下就是舉世聞名的斯坦福大學(xué)把夸。


圖片來自公開課Slides


? ? ? 這種設(shè)計模式而线,如上圖,將一個應(yīng)用程序的所有對象分為三層:Model恋日、View吞获、Controller, 每層之間的通信規(guī)則都有嚴(yán)格的規(guī)定谚鄙。這使得每一層用有非常好的獨(dú)立性各拷,以此大幅度簡化開發(fā)者后續(xù)對程序的修改和擴(kuò)展工作,也使得對程序中某一部分代碼重復(fù)利用更為容易闷营,使我們的程序結(jié)構(gòu)更加的直觀烤黍,讓開發(fā)者集中精力到解決問題上來,可以說這是一種非常面向?qū)ο蟮脑O(shè)計模式傻盟,這也是這種設(shè)計模式至今為什么如此被廣泛的使用的原因速蕊。


詳解:


Model (模型):

實現(xiàn)應(yīng)用程序具體功能的主體,在這里娘赴,你可以進(jìn)行 保存應(yīng)用程序數(shù)據(jù)规哲、建立需要的類、實現(xiàn)應(yīng)用程序的算法诽表、數(shù)據(jù)管理等操作唉锌。例如,寫一個計算器應(yīng)用竿奏,那么袄简,具體的計算功能,如 加減乘除 泛啸,就應(yīng)該在Model中去實現(xiàn)绿语。

View (視圖):

應(yīng)用程序的UI部分,由交互控件組成(實則每一個控件也都是一個View)候址,由它與用戶進(jìn)行交互吕粹,獲取用戶

Controller (控制器):

這是一個媒介,負(fù)責(zé)監(jiān)聽View中的用戶交互事件岗仑,簡稱為事件匹耕,(例如點(diǎn)擊屏幕、滑動屏幕)赔蒲,Controller 會將事件根據(jù)開發(fā)者設(shè)定的規(guī)則處理為數(shù)據(jù)泌神,然后調(diào)用Model中對應(yīng)的具體的功能模塊處理數(shù)據(jù)良漱,再將處理后的數(shù)據(jù)根據(jù)開發(fā)者的設(shè)定更新View,這就完成了一個完整的用戶交互欢际。

例如母市,一個點(diǎn)擊計算器中 “+” 按鍵的交互過程: Controller監(jiān)聽到View中用戶點(diǎn)擊了 “+” 這個Button,就去調(diào)用 Model 中對應(yīng)的加法運(yùn)算方法损趋,然后更新View -- 將運(yùn)算結(jié)果顯示在View當(dāng)中患久。

交互規(guī)則:


Controller -> View/Model



如上圖

Controller 指向 View 的綠色箭頭,這說明的是 Controller 可以控制 View浑槽,完成UI的更新操作蒋失,而 Outlet,是指在 Controller 中聲明了一個屬性桐玻,這個屬性指向了 View 中的某一部分篙挽。

Controller也可以向Model通信,進(jìn)行調(diào)用Model中的方法等操作...

那么Model可以和View 通信嗎? 不可以镊靴! 在MVC模式中铣卡,要求 Model 與 UI 完全獨(dú)立,它不能涉及到任何與 UI 相關(guān)的東西偏竟。



View -> Controller


View如何與Controller通信煮落?MVC 模式 對這種通信有如下規(guī)定:View 對 Controller 的通信必須是盲目的 -- 它不能擁有自己要展示的數(shù)據(jù),也不能知道事件的用途踊谋。

由此蝉仇,分為事件通信和數(shù)據(jù)通信兩種方式。

圖片來自公開課Slides


如上圖

事件通信: View 只可以告訴 Controller 一個事件 殖蚕,但 View 不可以知道這個事件的用途轿衔、作用。這種通信常見的有兩種方式:

一嫌褪、一種用來處理簡單事件的方式呀枢,就是我們在iOS開發(fā)中經(jīng)常用到的 Action胚股。例如笼痛,在 View 中放置一個滑動條 — Slider。 當(dāng)用戶滑動了Slider 琅拌,View 只會告訴 Controller 這個 Slider 被滑動了缨伊, 但 View 不可以知道這個 Slider 的用途。(例如进宝,是被用來調(diào)節(jié)音量的還是調(diào)節(jié)亮度的)

二刻坊、一種用來處理復(fù)雜事件的方式,就是將Controller 設(shè)定為 View 的代理党晋, 即 Delegate谭胚。例如我們將常用到的 ScrollViewDelegate徐块,常見的有 did、should灾而、will 方法胡控。View 通過Delegate告訴 Controller ,用戶對 ScrollView 的一些操作旁趟,例如 將要滑動 ScrollView 昼激、開始滑動 ScrollView、已經(jīng)滑動了ScrollView锡搜, Controller 作為 Delegate 根據(jù)這些事件去完成相應(yīng)的操作橙困,例如在 ScrollView 邊界上禁止用戶繼續(xù)滑動。


圖片來自公開課Slides

如上圖

數(shù)據(jù)通信:

View不能擁有數(shù)據(jù)耕餐,它只能展示數(shù)據(jù)凡傅,而數(shù)據(jù)來自哪里?Model肠缔!然而 View 禁止和 Model 進(jìn)行通信像捶,所以就需要 Controller 作為媒介進(jìn)行數(shù)據(jù)交互,這種情況桩砰,即是一種特殊的代理 -- DataSource拓春。 ?Controller 作為 DataSource,常見的有 count亚隅、data硼莽、at等方法,告訴 View 如何顯示數(shù)據(jù)煮纵,有多少數(shù)據(jù)等懂鸵。

例如利用 TableView 展示1000首歌曲信息,TableView 不能直接擁有1000 首歌曲的信息并加載1000行列表行疏,(這樣也極為浪費(fèi)內(nèi)存)匆光,而應(yīng)該委托 Controller 作為 DataSource ,由 DataSource 告訴 TableView 屏幕上所能一次顯示的歌曲信息酿联、每一行采用怎樣的格式顯示歌曲信息终息。當(dāng)用戶滑動列表,則成為一個事件交互贞让,由 TableViewDelegate 判斷是否讓 DataSource 給 TableView 更多的數(shù)據(jù)信息周崭。



Model -> Controller


圖片來自公開課Slides

最后,當(dāng) Model 中的數(shù)據(jù)改變時喳张,它如何通知給 Controller 呢续镇? 這是一個類似于廣播的方式,Model 會將自己的數(shù)據(jù)改變了這一信息廣播出去销部,Controller 和 View 都可以接受到這一信息摸航,但根據(jù) MVC 模式規(guī)則制跟, 只能讓 Controller 來對這一信息作出反應(yīng)。 這種方式被稱為 ?Notification 或者 KVO 酱虎。(具體的到我學(xué)習(xí)了這一部分后會詳細(xì)講解)凫岖。


以上

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2016.5.10

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逢净,隨后出現(xiàn)的幾起案子哥放,更是在濱河造成了極大的恐慌,老刑警劉巖爹土,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甥雕,死亡現(xiàn)場離奇詭異,居然都是意外死亡胀茵,警方通過查閱死者的電腦和手機(jī)社露,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琼娘,“玉大人峭弟,你說我怎么就攤上這事⊥哑矗” “怎么了瞒瘸?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長熄浓。 經(jīng)常有香客問我情臭,道長,這世上最難降的妖魔是什么赌蔑? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任俯在,我火速辦了婚禮,結(jié)果婚禮上娃惯,老公的妹妹穿的比我還像新娘跷乐。我一直安慰自己,他們只是感情好趾浅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布愕提。 她就那樣靜靜地躺著,像睡著了一般潮孽。 火紅的嫁衣襯著肌膚如雪揪荣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天往史,我揣著相機(jī)與錄音,去河邊找鬼佛舱。 笑死椎例,一個胖子當(dāng)著我的面吹牛挨决,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播订歪,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼脖祈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刷晋?” 一聲冷哼從身側(cè)響起盖高,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眼虱,沒想到半個月后喻奥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捏悬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年撞蚕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片过牙。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡甥厦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寇钉,到底是詐尸還是另有隱情刀疙,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布扫倡,位于F島的核電站庙洼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏镊辕。R本人自食惡果不足惜油够,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望征懈。 院中可真熱鬧石咬,春花似錦、人聲如沸卖哎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亏娜。三九已至焕窝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間维贺,已是汗流浹背它掂。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虐秋。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓榕茧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親客给。 傳聞我的和親對象是個殘疾皇子用押,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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