Block昨凡,Delegate 爽醋,Notification 各自特點

一、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)過五步:

  1. 創(chuàng)建一個 delegate戚啥;

  2. 委托者聲明一個delegate奋单;

  3. 委托者調(diào)用delegate內(nèi)的方法(method);

  4. 被委托者設(shè)置delegate猫十,以便被委托者調(diào)用览濒;

  5. 被委托者實現(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則是多對多的消息傳遞

鄙人理解深度就到此了线脚,若有理解不正之處,歡迎拍磚指正板甘,共同進步党瓮,跪謝!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盐类,一起剝皮案震驚了整個濱河市麻诀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌傲醉,老刑警劉巖蝇闭,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異硬毕,居然都是意外死亡呻引,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門吐咳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逻悠,“玉大人元践,你說我怎么就攤上這事⊥耍” “怎么了单旁?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饥伊。 經(jīng)常有香客問我象浑,道長,這世上最難降的妖魔是什么琅豆? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任愉豺,我火速辦了婚禮,結(jié)果婚禮上茫因,老公的妹妹穿的比我還像新娘蚪拦。我一直安慰自己,他們只是感情好冻押,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布驰贷。 她就那樣靜靜地躺著,像睡著了一般洛巢。 火紅的嫁衣襯著肌膚如雪饱苟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天狼渊,我揣著相機與錄音,去河邊找鬼类垦。 笑死狈邑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蚤认。 我是一名探鬼主播米苹,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砰琢!你這毒婦竟也來了蘸嘶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤陪汽,失蹤者是張志新(化名)和其女友劉穎训唱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挚冤,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡况增,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了训挡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澳骤。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡歧强,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出为肮,到底是詐尸還是另有隱情摊册,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布颊艳,位于F島的核電站茅特,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏籽暇。R本人自食惡果不足惜温治,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望戒悠。 院中可真熱鬧熬荆,春花似錦、人聲如沸绸狐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寒矿。三九已至突琳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間符相,已是汗流浹背拆融。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啊终,地道東北人镜豹。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像蓝牲,于是被迫代替她去往敵國和親趟脂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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