比較iOS的三種通知機制

2021-07-07 04:02:55 字數 3146 閱讀 7383

1**delegation

2通知中心notification center

3鍵值觀察key value observing,kvo

下面分析比較一下這三者:

上面的三種模式是什麼?

三種模式都是乙個物件傳遞事件給另外乙個物件,並且不要他們有耦合。三種模式都是物件來通知某個事件發生了的方法,或者更準確的說,是允許其他的物件收到這種事件的方法。這對於乙個物件來說,是非常普通而且必須做的任務,因為沒有通訊,controllers將不能整合到整個應用中。controller的另外乙個目的是盡可能的自包含。

這三種模式給controllers(也可以是其他的物件)提供通訊的方法。下面將描述如何在ios應用中使用這些模式同樣需要注意的他們在其他的地方也會用到,並且確實是存在。

. delegation

當我們第一次編寫ios應用時,我們注意到不斷的在使用「delegate」,並且貫穿於整個sdk。

delegation的基本特徵是,乙個controller定義了乙個協議(即一系列的方法定義)。該協議描述了乙個delegate物件為了能夠響應乙個controller的事件而必須做的事情。協議就是delegator說,「如果你想作為我的delegate,那麼你就必須實現這些方法」。實現這些方法就是允許controller在它的delegate能夠呼叫這些方法,而它的delegate知道什麼時候呼叫哪種方法。delegate可以是任何一種物件型別,因此controller不會與某種物件進行耦合,但是當該物件嘗試告訴委託事情時,該物件能確定delegate將響應。

三者優缺點:

delegate 的 優勢 :

1.非常嚴格的語法。所有將聽到的事件必須是在delegate協議中有清晰的定義。

2.如果delegate中的乙個方法沒有實現那麼就會出現編譯警告/錯誤

3.協議必須在controller的作用域範圍內定義

4.在乙個應用中的控制流程是可跟蹤的並且是可識別的;

5.在乙個控制器中可以定義定義多個不同的協議,每個協議有不同的delegates

6.沒有第三方物件要求保持/監視通訊過程。

7.能夠接收呼叫的協議方法的返回值。這意味著delegate能夠提供反饋資訊給controller

8.經常被用在存在父子關係的物件之間通訊,例如控制器和控制器的view(自己加的理解)

缺點 :

1.需要定義很多**:1.協議定義;2.controller的delegate屬性;3.在delegate本身中實現delegate方法定義

2.在釋放**物件時,需要小心的將delegate改為nil。一旦設定失敗,那麼呼叫釋放物件的方法將會出現記憶體crash

3.在乙個controller中有多個delegate物件,並且delegate是遵守同乙個協議,但還是很難告訴多個物件同乙個事件,不過有可能。

4.只能一對一通訊,乙個物件只有乙個**(不知道是缺點還是優點,只能算是特點)

notification 的 優勢 :

1.不需要編寫多少**,實現比較簡單

2.對於乙個發出的通知,多個物件能夠做出反應,即一對多的方式實現簡單

3.controller能夠傳遞context物件(dictionary),context物件攜帶了關於傳送通知的自定義的資訊

缺點 :

1.在編譯期不會檢查通知是否能夠被觀察者正確的處理;

2.在釋放註冊的物件時,需要在通知中心取消註冊;

3.在除錯的時候應用的工作以及控制過程難跟蹤;

4.需要第三方物件來管理controller與觀察者物件之間的聯絡;

5.controller和觀察者需要提前知道通知名稱、userinfo dictionary keys。如果這些沒有在工作區間定義,那麼會出現不同步的情況;

6.通知發出後,controller不能從觀察者獲得任何的反饋資訊(相比較delegate)。

kvo 的 優勢 :

1.能夠提供一種簡單的方法實現兩個物件間的同步。例如:model和view之間同步;

2.能夠對非我們建立的物件,即內部物件的狀態改變作出響應,而且不需要改變內部物件(skd物件)的實現;

3.能夠提供觀察的屬性的最新值以及先前值;

4.用key paths來觀察屬性,因此也可以觀察巢狀物件;

5.完成了對觀察物件的抽象,因為不需要額外的**來允許觀察值能夠被觀察

6.可以一對多,乙個通知可以發給多個觀察者。

缺點 :

1.我們觀察的屬性必須使用strings來定義。因此在編譯器不會出現警告以及檢查;

2.對屬性重構將導致我們的觀察**不再可用;

3.複雜的「if」語句要求物件正在觀察多個值。這是因為所有的觀察**通過乙個方法來指向;

4.當釋放觀察者時不需要移除觀察者。

效率 肯定是delegate比nsnotification高。

delegate方法比notification更加直接,最典型的特徵是,delegate方法往往需要關注返回值, 也就是delegate方法的結果。比如-windowshouldclose:,需要關心返回的是yes還是no。所以delegate方法往往包含 should這個很傳神的詞。也就是好比你做我的delegate,我會問你我想關閉視窗你願意嗎?你需要給我乙個答案,我根據你的答案來決定如何做下一 步。相反的,notification最大的特色就是不關心接受者的態度, 我只管把通告放出來,你接受不接受就是你的事情,同時我也不關心結果。所以notification往往用did這個詞彙,比如 nswindowdidresizenotification,那麼nswindow物件放出這個notification後就什麼都不管了也不會等待接 受者的反應。

2、kvo和nsnotification的區別 :

兩者都是觀察者模式,不同的是,kvo是被觀察者直接傳送訊息給觀察者,是物件間的互動,而通知則是觀察者和被觀察者通過通知中心物件之間進行互動,即訊息由被觀察者傳送到通知中心物件,再由中心物件發給觀察者,兩者之間並不進行直接的互動。

和delegate一樣,kvo和nsnotification的作用也是類與類之間的通訊,與delegate不同的是

1)這兩個都是負責發出通知,剩下的事情就不管了,所以沒有返回值;

2)delegate只是一對一,而這兩個可以一對多。這兩者也有各自的特點。

總結:

winphone三種推送通知

原生通知 raw notification 原生通知用於裝置中真正在執行的程式。它允許你在使用者使用時實時更新使用者介面。吐司通知 toast notification 無論程式是否在執行都會收到這個訊息,但在程式執行時彈出吐司訊息可能會有點兒討人厭。我會在下面的例子中演示。吐司通知不能更新你程式的...

三種迴圈的比較

switch case 語法 switch 表示式 變數 case 值1 語句1 break case 值2 語句2 break default 語句3 break 執行過程 當程式執行到switch 表示式 變數 先判斷括號裡的表示式,執行大括號裡的case 後面的值1 如果和值1匹配,就執行語句...

Spring中常用三種通知

1 前置通知 介面 org.springframework.aop.methodbeforeadvice 使用前置通知可以在聯結點執行前進行自定義的操作。不過,spring裡只有一種聯結點,即方法呼叫,所以前置通知事實上就是讓你能在方法呼叫前進行一些操作。前置通知可以訪問呼叫的目標方法,也可以對該方...