KVO、Delegate、Notification 區(qū)別及相關(guān)使用場(chǎng)景

你要知道的KVC、KVO、Delegate、Notification都在這里

轉(zhuǎn)載請(qǐng)注明出處 http://www.itdecent.cn/p/9215251693f0

本系列文章主要通過(guò)講解KVC、KVO、Delegate、Notification的使用方法,來(lái)探討KVO、Delegate、Notification的區(qū)別以及相關(guān)使用場(chǎng)景,本系列文章將分一下幾篇文章進(jìn)行講解,讀者可按需查閱。

KVO、Delegate、Notification 區(qū)別及相關(guān)使用場(chǎng)景

經(jīng)過(guò)前面四篇文章的學(xué)習(xí)我們已經(jīng)可以熟練使用KVO、DelegateNotification了,但三者又有什么區(qū)別呢?

在實(shí)際開(kāi)發(fā)中需要在ViewController之間進(jìn)行通信,也需要跨Controller進(jìn)行通信,上述三種方式都是為了通信而生,這三種方法都能夠減少耦合,使得View或是Controller能夠自包含,盡量不受其他對(duì)象的影響,這樣就能夠?qū)崿F(xiàn)盡可能的復(fù)用。

針對(duì)某一需求往往有不止一種實(shí)現(xiàn)方式,當(dāng)然上述三種方法也都可以互相替換,所以我認(rèn)為沒(méi)有百分百正確的使用方法或是百分百錯(cuò)誤的使用方法,只有合適和不合適的方法,我們盡量挑選最適合應(yīng)用程序開(kāi)發(fā)的方式來(lái)滿(mǎn)足我們的需求,接下來(lái)的內(nèi)容可能并不完全正確,僅僅是我的個(gè)人理解,如果錯(cuò)誤還請(qǐng)不吝賜教。

KVO

KVOmac開(kāi)發(fā)中使用的非常頻繁,KVO提供了一個(gè)對(duì)象監(jiān)聽(tīng)另一個(gè)對(duì)象屬性值變化的方法,KVO適合多對(duì)一的監(jiān)聽(tīng),多個(gè)對(duì)象可以監(jiān)聽(tīng)同一個(gè)對(duì)象屬性值的變化,我們?cè)陂_(kāi)發(fā)中常用于監(jiān)聽(tīng)Model屬性值的變化從而動(dòng)態(tài)的更新視圖,它提供了一種模型屬性值一旦修改視圖可以立即按需求修改的功能,其優(yōu)點(diǎn)有:

  • 創(chuàng)建監(jiān)聽(tīng)器的實(shí)現(xiàn)簡(jiǎn)單,只需要注冊(cè)后實(shí)現(xiàn)回調(diào)函數(shù)即可
  • 能夠?qū)崿F(xiàn)多對(duì)一的監(jiān)聽(tīng),多個(gè)對(duì)象可同時(shí)監(jiān)聽(tīng)同一個(gè)對(duì)象屬性值的變化
  • KVO提供了監(jiān)聽(tīng)新值以及舊值的方法,可以獲取到修改前的值
  • 支持keyPath來(lái)監(jiān)聽(tīng)嵌套屬性值
  • 支持context區(qū)分監(jiān)聽(tīng)器

但是經(jīng)過(guò)前面KVO文章的講解,我們也發(fā)現(xiàn)了其不少缺點(diǎn):

  • 注冊(cè)監(jiān)聽(tīng)器和刪除監(jiān)聽(tīng)器必須成套出現(xiàn)
  • 重復(fù)刪除監(jiān)聽(tīng)器會(huì)發(fā)生異常
  • 監(jiān)聽(tīng)器對(duì)象銷(xiāo)毀前未刪除監(jiān)聽(tīng)器可能發(fā)生野指針異常
  • 繼承類(lèi)的KVO處理較復(fù)雜
  • keyPath為字符串類(lèi)型不能提供編譯器檢查
  • 監(jiān)聽(tīng)的屬性值源碼的名稱(chēng)發(fā)生變化需要修改代碼

Delegate

在學(xué)習(xí)iOS開(kāi)發(fā)時(shí),我們最常用的應(yīng)該就是委托模式了,UITableViewUICollectionView等等,委托模式提供了兩種實(shí)現(xiàn)方式,一種是事件的代理,一種是數(shù)據(jù)源的代理,我們可以通知委托對(duì)象針對(duì)相關(guān)事件進(jìn)行響應(yīng),也可以從委托對(duì)象獲取想要的數(shù)據(jù),委托模式基于協(xié)議protocol實(shí)現(xiàn),提供了一種規(guī)范化的實(shí)現(xiàn)方式,并且delegate是一種一對(duì)一的實(shí)現(xiàn)方式,其優(yōu)點(diǎn)有:

  • 基于協(xié)議實(shí)現(xiàn),提供了規(guī)范化的實(shí)現(xiàn)方法
  • 在編譯期就能夠檢查是否實(shí)現(xiàn)了代理必須實(shí)現(xiàn)的方法
  • 提供事件響應(yīng)的代理模式
  • 提供數(shù)據(jù)源的代理模式
  • 即時(shí)沒(méi)有委托對(duì)象也不會(huì)產(chǎn)生異常

其缺點(diǎn)有:

  • 規(guī)范化帶來(lái)了實(shí)現(xiàn)上的復(fù)雜,必須遵守協(xié)議并實(shí)現(xiàn)所有方法
  • 只能實(shí)現(xiàn)一對(duì)一的通信,如果多個(gè)對(duì)象都委托同一代理,為了區(qū)分不同的被委托對(duì)象,造成代碼的復(fù)雜化

NSNotificationCenter

NSNotificationCenter通知中心提供了一種多對(duì)一的通信方式,與KVO相同,多個(gè)監(jiān)聽(tīng)器對(duì)象可以同時(shí)監(jiān)聽(tīng)同一通知,能夠提供低耦合的實(shí)現(xiàn)方式,監(jiān)聽(tīng)器對(duì)象可以接收到通知的信息,但發(fā)送通知的對(duì)象實(shí)現(xiàn)了隱藏,無(wú)法得知具體的發(fā)送對(duì)象,iOS中很多系統(tǒng)控件都會(huì)發(fā)送相關(guān)通知,最常見(jiàn)的如鍵盤(pán),包括應(yīng)用程序的狀態(tài)等,其優(yōu)點(diǎn)有:

  • 創(chuàng)建通知的監(jiān)聽(tīng)器簡(jiǎn)單,只需注冊(cè)后實(shí)現(xiàn)監(jiān)聽(tīng)放法即可
  • 能夠?qū)崿F(xiàn)多對(duì)一的監(jiān)聽(tīng)
  • 通過(guò)NSNotification的userInfo能夠傳遞通知的信息
  • iOS9以后不需要手動(dòng)刪除監(jiān)聽(tīng)器對(duì)象也不會(huì)產(chǎn)生異常

其缺點(diǎn)有:

  • 通知名稱(chēng)使用字符串類(lèi)型,在編譯器無(wú)法檢查
  • 參數(shù)傳遞使用userInfo字典類(lèi)型,參數(shù)獲取需要規(guī)范定義
  • 不能獲取發(fā)送通知對(duì)象的狀態(tài)信息

總結(jié)

從上面的優(yōu)缺點(diǎn)分析來(lái)看,三種方法都有各自的優(yōu)缺點(diǎn),因此,沒(méi)有正確與否,只有適不適合我們的需求,我在開(kāi)發(fā)中使用較多的是delegateKVO,但KVO的使用過(guò)多后就會(huì)發(fā)現(xiàn)有些濫用,在某些情況下NSNotificationCenter更加適合,并且KVO在使用時(shí)必須非常小心的注冊(cè)和刪除監(jiān)聽(tīng)器。

備注

由于作者水平有限,難免出現(xiàn)紕漏,如有問(wèn)題還請(qǐng)不吝賜教。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容