title: 斯坦福大學(xué)iOS公開(kāi)課學(xué)習(xí)筆記(1)---iOS的MVC框架
date: 2017-04-26 15:34:44
tags:
還記得大二決心要學(xué)習(xí)iOS開(kāi)發(fā)的時(shí)候曾經(jīng)看過(guò)斯坦福大學(xué)公開(kāi)課中白胡子老頭的經(jīng)典視頻疫萤。不過(guò)因?yàn)楫?dāng)時(shí)對(duì)iOS還不是非常了解,導(dǎo)致看著看著就扔下了「疑欤現(xiàn)在畢業(yè)也有將近一年的時(shí)間了扯饶,決定重新刷一遍這個(gè)經(jīng)典的公開(kāi)課視頻,并且寫(xiě)下學(xué)習(xí)筆記放到這里池颈。同時(shí)在我的博客里也會(huì)慢慢更新新的筆記尾序。
簡(jiǎn)介
MVC設(shè)計(jì)模式,全名為 Model-View-Controller躯砰,是模型(Model)-視圖(View)-控制器(Controller)的縮寫(xiě)每币。它將一個(gè)程序分為了三個(gè)陣營(yíng)。圖片來(lái)自于課件
基本概念
- 模型(Model):負(fù)責(zé)封裝琢歇、存儲(chǔ)和處理數(shù)據(jù)兰怠。
- 視圖(View):負(fù)責(zé)展示數(shù)據(jù),監(jiān)聽(tīng)用戶的動(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èn)一些自己無(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)聽(tīng)者
- (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)聽(tīng)者的控制器就會(huì)接受到來(lái)自模型的信號(hào)回溺,做出相應(yīng)的改變春贸。
-
KVO(鍵值對(duì)觀察)
與通知一樣,在控制器中注冊(cè)成為觀察者遗遵,實(shí)現(xiàn)回調(diào)方法萍恕,在模型發(fā)生改變的時(shí)候可以通過(guò)激活回調(diào)方法讓控制器做出一些動(dòng)作。
模型(Model)與視圖(View):不能
很明顯车要,最開(kāi)始的圖片中允粤,模型和視圖中間是雙黃線。模型是完全獨(dú)立于UI的翼岁,所以模型和視圖是完全不可以通信的类垫。
多個(gè)MVC結(jié)構(gòu)同時(shí)作用
一定不要寫(xiě)成的樣子
Objective-C
第一節(jié)課中還講了一些OC中的屬性和知識(shí)點(diǎn)。
類文件類型
- .h文件:公開(kāi)API琅坡,其他類可以調(diào)用阔挠,告訴其他類我能做什么 what I can do
- .m文件:私有API,其他類不可用脑蠕,實(shí)現(xiàn).h文件中的方法how to do
屬性
- strong:在堆中保持所指向的東西购撼,只要有一個(gè)強(qiáng)指針指向就會(huì)存在,否則就會(huì)釋放谴仙。
- weak:如果沒(méi)有強(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ì)量驰怎。