title: 斯坦福大學(xué)iOS公開課學(xué)習(xí)筆記(1)---iOS的MVC框架
date: 2017-04-26 15:34:44
tags:
還記得大二決心要學(xué)習(xí)iOS開發(fā)的時(shí)候曾經(jīng)看過(guò)斯坦福大學(xué)公開課中白胡子老頭的經(jīng)典視頻。不過(guò)因?yàn)楫?dāng)時(shí)對(duì)iOS還不是非常了解,導(dǎo)致看著看著就扔下了。現(xiàn)在畢業(yè)也有將近一年的時(shí)間了,決定重新刷一遍這個(gè)經(jīng)典的公開課視頻,并且寫下學(xué)習(xí)筆記放到這里。同時(shí)在我的博客里也會(huì)慢慢更新新的筆記。
簡(jiǎn)介
MVC設(shè)計(jì)模式,全名為 Model-View-Controller,是模型(Model)-視圖(View)-控制器(Controller)的縮寫。它將一個(gè)程序分為了三個(gè)陣營(yíng)。圖片來(lái)自于課件

基本概念
- 模型(Model):負(fù)責(zé)封裝、存儲(chǔ)和處理數(shù)據(jù)。
- 視圖(View):負(fù)責(zé)展示數(shù)據(jù),監(jiān)聽用戶的動(dòng)作。
- 控制器(Controller):負(fù)責(zé)處理邏輯業(yè)務(wù),響應(yīng)事件,加工數(shù)據(jù)。
通信
控制器(Controller)與視圖(View)
控制器(Controller) -> 視圖(View):完全控制
控制器可以完全知道視圖的所有行為,具有完全控制權(quán)。
這里提到了 outlet,outlet(輸出口)是一種特殊的OC屬性,用關(guān)鍵字IBOutlet聲明,輸出口是在控制器類的頭文件中聲明
@property (nonatomic,retain) IBOutlet UIButton *mybutton;
上邊代碼中就聲明了一個(gè)mybutton的輸出口,可以設(shè)置它指向IB中的任何一個(gè)button,通過(guò)mybutton這個(gè)對(duì)象,我們就可以獲得到該button的相關(guān)屬性。
視圖(View) -> 控制器(Controller):盲的通信
因?yàn)閂iew是通用的,所以他不知道調(diào)用他的Controller,所以他只能通過(guò)盲通信的方式與Controller通信。
-
target 通信
控制器本身有一個(gè)目標(biāo)方法(target),然后將這個(gè)目標(biāo)給視圖的行為方法(action),當(dāng)視圖中觸發(fā)這個(gè)行為時(shí),視圖會(huì)發(fā)送消息給控制器的目標(biāo)告訴控制器有人對(duì)他進(jìn)行了操作。比如按鈕的點(diǎn)擊事件、滑動(dòng)條的滑動(dòng)事件。
UIButton *myBtn = [[UIButton alloc] init];
[myBtn addTarget:self action:@selector(myBtnClicked) forControlEvents:UIControlEventTouchUpInside];
- (void)myBtnClicked
{
NSLog(@"myBtn clicked");
}
比如上邊兩段代碼就表示了一個(gè)按鈕設(shè)置target為self,并且設(shè)置行為為myBtnClicked,所以當(dāng)用戶點(diǎn)擊了這個(gè)按鈕時(shí),我們就會(huì)打印出 myBtn clicked 。
-
代理(Delegate)與數(shù)據(jù)源(DataSource)通訊
代理(Delegate),視圖向控制器詢問一些自己無(wú)法決定的事情的時(shí)候,或者讓控制器幫忙來(lái)完成一些他自己無(wú)法完成的事情的時(shí)候會(huì)用到代理方法。比如通過(guò)一些關(guān)鍵字(will、should、did)來(lái)描述視圖當(dāng)前的情況,控制器就可以通過(guò)情況進(jìn)行判斷。比如
UITableView中就有許多代理方法來(lái)告訴控制器視圖當(dāng)前的狀態(tài)。數(shù)據(jù)源(DataSource),視圖不該持有他的數(shù)據(jù),如果視圖持有了數(shù)據(jù)就違背了他的通用性。數(shù)據(jù)應(yīng)該屬于在模型中,他與UI無(wú)關(guān),所以控制器必須有方法告訴視圖他有多少數(shù)據(jù)。數(shù)據(jù)源是一種特殊的代理。還是拿
UITableView舉例子,他就有數(shù)據(jù)源方法來(lái)獲取數(shù)據(jù)。
控制器(Controller)與 模型(Model)
控制器(Controller) -> 模型(Model):完全控制
控制器可以完成控制模型,可以知道模型中的一切。
模型(Model) -> 控制器(Controller): 廣播通知
通常情況下,模型是不可以和控制器通信的,不過(guò)當(dāng)模型中的數(shù)據(jù)發(fā)生了改變,他就需要告知控制器,我的數(shù)據(jù)變了。模型可以像電臺(tái)一樣發(fā)布廣播,控制器中可以接收到模型發(fā)出的信號(hào)并進(jìn)行處理。
-
通知(Notification)
一般來(lái)說(shuō),控制器中會(huì)注冊(cè)成為監(jiān)聽者
- (void)addObserver:(id)observer selector:(SEL)aSelector name:
當(dāng)模型中的值發(fā)生改變時(shí),模型會(huì)發(fā)出通知
- (void)postNotification:(NSNotification *)notification;
- (void)postNotificationName:(NSString *)aName object:(id)anObject;
成為監(jiān)聽者的控制器就會(huì)接受到來(lái)自模型的信號(hào),做出相應(yīng)的改變。
-
KVO(鍵值對(duì)觀察)
與通知一樣,在控制器中注冊(cè)成為觀察者,實(shí)現(xiàn)回調(diào)方法,在模型發(fā)生改變的時(shí)候可以通過(guò)激活回調(diào)方法讓控制器做出一些動(dòng)作。
模型(Model)與視圖(View):不能
很明顯,最開始的圖片中,模型和視圖中間是雙黃線。模型是完全獨(dú)立于UI的,所以模型和視圖是完全不可以通信的。
多個(gè)MVC結(jié)構(gòu)同時(shí)作用

一定不要寫成的樣子

Objective-C
第一節(jié)課中還講了一些OC中的屬性和知識(shí)點(diǎn)。
類文件類型
- .h文件:公開API,其他類可以調(diào)用,告訴其他類我能做什么 what I can do
- .m文件:私有API,其他類不可用,實(shí)現(xiàn).h文件中的方法how to do
屬性
- strong:在堆中保持所指向的東西,只要有一個(gè)強(qiáng)指針指向就會(huì)存在,否則就會(huì)釋放。
- weak:如果沒有強(qiáng)指針指向的話,會(huì)被設(shè)置成nil指針。
- nonatomic:非原子性,保證線程安全,不能讓兩個(gè)線程同時(shí)設(shè)置該屬性。
結(jié)束
第一節(jié)課講的東西比較基礎(chǔ),但是現(xiàn)在回來(lái)再看會(huì)發(fā)現(xiàn)還是會(huì)學(xué)到一些新的知識(shí)。這節(jié)課重點(diǎn)介紹了MVC架構(gòu),合理的使用MVC可以降低類之間的耦合性,提高代碼質(zhì)量。