一、Block
它是帶有局部變量的匿名函數(shù)便脊,它是一段代碼塊蚂四,與C語言中的函數(shù)指針類似,可當做參數(shù)進行傳值哪痰,且可以沒有名字遂赠。(在我另外一篇文章中有詳細介紹)
解決的問題
1.解決兩個對象之間的通信問題(傳值或者事件)
它既可以正向傳值也可以反向傳值,傳遞方定義好block晌杰,調(diào)用block跷睦,在調(diào)用方創(chuàng)建傳遞方的類的實例對象,在實例對象的block中實現(xiàn)相關(guān)代碼肋演,如果有傳值就可以獲取傳遞值進行相關(guān)操作抑诸,如果沒有參數(shù)可傳,則就傳遞了一個事件爹殊,具體看這個事件是在何種情況下傳遞出去的蜕乡,比如A的按鈕被點擊,可定義一個block放在A按鈕點擊方法里梗夸,B想監(jiān)聽A中按鈕點擊事件层玲,則可在B中實例化A的對象,A.block 中就可以執(zhí)行A中按鈕點擊后反症,B想做的事辛块。
2.block回調(diào)
這類似于1的一個變種,只不過把block嵌進了方法里惰帽,在調(diào)用方法完成后就執(zhí)行回調(diào)block中的代碼憨降。最直接的例子就是網(wǎng)絡(luò)請求編寫的GET和POST的回調(diào)方法了。在定義處把傳遞值賦給block的參數(shù)该酗,在調(diào)用處就可以取得block參數(shù)里的變量授药。特點
1.一對一的消息傳遞
2.需先聲明Block士嚎,調(diào)用block,實現(xiàn)block悔叽,相比于delegate簡直是不要太簡潔莱衩。
3.能實現(xiàn)方法回調(diào)缺點
使用時需要注意避免循環(huán)使用的問題(使用__weak關(guān)鍵字修飾詞可避免)。
二娇澎、Delegate
Delegate (委托/代理)是 iOS 開發(fā)中常用的設(shè)計模式笨蚁,表示將一個對象的部分功能轉(zhuǎn)交給另一個對象。借助 protocol 可以很方便的實現(xiàn)這種設(shè)計模式趟庄。
通常括细,一個delegate的使用過程,需要經(jīng)過五步:
創(chuàng)建一個 delegate戚啥;
委托者聲明一個delegate奋单;
委托者調(diào)用delegate內(nèi)的方法(method);
被委托者設(shè)置delegate猫十,以便被委托者調(diào)用览濒;
被委托者實現(xiàn)Delegate 所定義的方法。
解決的問題
Delegate通過protocol 實現(xiàn)了不同視圖之間的數(shù)據(jù)交互(事件拖云、傳值贷笛,與block的功能類似)。 Delegate 屬于事件驅(qū)動的范疇宙项。只有當某一事件觸發(fā)時乏苦,delegate 才被調(diào)用。特點:
1.能夠接收調(diào)用的協(xié)議方法的返回值杉允。這意味著delegate能夠提供反饋信息給controller邑贴。(這是利用代理傳值的一個使用)
2.實現(xiàn)一對一的消息傳遞
3..在一個類中可以定義多個不同的協(xié)議,每個協(xié)議有不同的delegates
4.協(xié)議中的方法有必須實現(xiàn)的叔磷,也可以有不必須實現(xiàn)的拢驾,但要有@optional修飾缺點:
1.定義代碼太多,步驟繁瑣
2.只能實現(xiàn)一對一的消息傳遞
3.有非常嚴格的語法(比如定義delegate不能使用強引用改基,只能使用弱引用)
4.不調(diào)用就不會觸發(fā)協(xié)議方法
三繁疤、Notification
允許當事件發(fā)生時通知一些對象。它允許我們在低程度耦合的情況下秕狰,滿足控制器與一個任意的對象進行通信的目的稠腊。這里可能會和KVO(健值觀察)混淆,Notification 和 KVO 都是觀察著模式鸣哀,側(cè)重點不一樣架忌。
- 解決問題
通知,是Model與Controller通信的方式之一我衬。一般是Model發(fā)送變化的時候叹放,會發(fā)送通知告訴Controller饰恕,Controller再做相應(yīng)的處理。需要先往通知中心里面注冊觀察者井仰,然后在合適的時機埋嵌,通知中心post通知,觀察者做對應(yīng)的處理俱恶,當觀察者將要釋放的時候雹嗦,從通知中心移除觀察者。
KVO合是,也是M與C通訊的方式了罪。一般是C去觀察M的某個屬性,某個屬性發(fā)生變化之后聪全,C做出相應(yīng)的處理捶惜,當C將要釋放的時候,M移除觀察者荔烧。
通知往往用于多對多的場景,多個觀察者觀察一個通知汽久,一旦這個通知被通知中心post鹤竭,所有觀察者都可以做出響應(yīng)。具體的實現(xiàn)流程是:(1)通知中心通過addObserver方法添加觀察者景醇,其實是把觀察者和通知進行綁定臀稚,多次使用addObserver方法可以為同一個通知添加多個觀察者。(2)通知中心發(fā)送通知三痰。(3)各個觀察者做各自的處理吧寺。(4)在觀察者銷毀之前(dealloc中),從通知中心移除觀察者散劫。
KVO多用于1對1的場景稚机,一個對象去觀察另外一個對象的屬性值有沒有發(fā)生變化,一旦發(fā)生變化获搏,觀察者做出響應(yīng)赖条。具體的流程是:(1)被觀察者添加觀察者,指定觀察者觀察的屬性常熙。(2)被觀察者的屬性在某一時間發(fā)生了變化纬乍。(3)觀察者做出響應(yīng)。(4)在觀察者銷毀之前裸卫,先移除觀察者仿贬。
KVO其實也可以1對多,就是多個觀察者觀察同一個對象同一個屬性的變化墓贿。KVO和通知給人的感覺一個主動通知(通知會由通知中心主動post)茧泪,一個是被動通知(KVO蜓氨,觀察者一直盯著屬性變沒變,一旦變化调炬,自己就做出響應(yīng)语盈。被觀察的對象不是主動告知你我變了)。
特點
1.不需要編寫多少代碼缰泡,實現(xiàn)比較簡單刀荒;
2.對于一個發(fā)出的通知,多個對象能夠做出反應(yīng)棘钞,即1對多的方式實現(xiàn)簡單
3.controller能夠傳遞context對象(dictionary)缠借,context對象攜帶了關(guān)于發(fā)送通知的自定義的信息缺點
1.在編譯期不會檢查通知是否能夠被觀察者正確的處理;
2.在釋放注冊的對象時宜猜,需要在通知中心取消注冊泼返;
3.controller和觀察者需要提前知道通知名稱、UserInfo dictionary keys姨拥。如果這些沒有在工作區(qū)間定義绅喉,那么會出現(xiàn)不同步的情況,通知就沒有了意義叫乌;
6.通知發(fā)出后块请,controller不能從觀察者獲得任何的反饋信息灌诅。是否成功接收,發(fā)送者也不會知道。
總結(jié)
Block 盔憨、Delegate浙宜、Notification共同點
1.能解決不同類之間消息傳遞問題區(qū)別:
1.Block和Delegate都是一對一的消息傳遞平夜,Notification則是多對多的消息傳遞