ios事件的通知方法

1 手動廣播者和監聽者(Broadcaster and listeners)

2鍵-值觀察 key Value Observing

3通知中心 notification center

4 上下文通知 context notification

5用於觀察的weituo delegate

關於觀察者
觀察者模式是維持兩個模塊之間抽象關係的最強大的方式之一。觀察者模式包括一個發佈已發生事件的模塊以及響應該事件的另一模塊的若干個的實例。它和直接調 用第二個模塊的方法不同,因爲第一個模塊不需要關注有多少個觀察者,從而實現觀察者和被觀察者之間更加完全的抽象關係。

手動廣播者和監聽者

手動的方式需要廣播者保有一個監聽者的數組(NSArray)或集合(NSSet)。在需要通知監聽者一個事件的合適時機廣播者直接調用各個監聽者上相關方法。

在廣播者類上你可能需要一個NSMutableArray、NSSet或NSMutableDictionary。NSMutableDictionary比較適合將事件標識符的類型作爲每個監聽者的鍵值。在廣播者上你還需要有監聽者註冊和取消註冊的方法。
給NSArray或NSSet中的每個對象方式消息的方法很簡單,如下:

[listenersCollection makeObjectsPerformSelector:@selector(methodSupportedByEveryListener)];
優點: 廣播者對監聽者列表有完全的控制。
缺點: 在集合中手動添加或移除監聽者(尤其是在由於其他原因已經不被維護的情況下)。如果需要發佈不同消息的情況下就需要更多的手動工作。

鍵值觀察
鍵值觀察協議時朝着自動化如上過程方向的一個很大進步。在很多情況下,廣播者不需要做任何事情。
每個Cocoa對象自動處理用於發佈任何對象的addObserver:forKeyPath:options:context:。如果廣播者的 “setter”方法遵循某些規則,“setter”方法就會自動觸發任何監聽者的 observeValueForKeyPath:ofObject:change:context:方法。
例如如下代碼就會在“source”對象上加入一個觀察者::

[source      addObserver:destination      forKeyPath:@"myValue"     options:NSKeyValueChangeNewKey      context:nil];
這樣在每次調用setMyValue:方法的時候都會發送一個observeValueForKeyPath:ofObject:change:context:消息到destination。
你所需要做的就是在被觀察對象上註冊監聽者並讓監聽者實現observeValueForKeyPath:ofObject:change:context:。

優點: 內置的而且是自動的。可以觀察任何鍵路徑。支持依賴通知。
缺點: 廣播者無法知道誰在監聽。方法必須符合命名規則以實現自動觀察消息的運作。監聽者必須在被刪除之前被移除,否者接下來的通知就會導致崩潰和失效-不過這對於該文中指出的所有方法都是一樣的。

通知中心
NSNotificationCenter提供了一種更加解耦的方式。最典型的應用就是任何對象對可以發送通知到中心,同時任何對象可以監聽中心的通知。
發送通知的代碼如下:

[[NSNotificationCenter defaultCenter]      postNotificationName:@”myNotificationName”     object:broadcasterObject];
註冊接收通知的代碼如下:

[[NSNotificationCenter defaultCenter]      addObserver:listenerObject      selector:@selector(receivingMethodOnListener:)      name:@”myNotificationName”     object:nil];
註冊通知的時候可以指定一個具體的廣播者對象,但這不是必須的。你可能注意到了defaultCenter 。實際上這是你在應用中會使用到的唯一的中心。通知會向整個應用開放,因此只有一箇中心。
同時還有一個NSDistributedNotificationCenter。這是用來應用間通信的。在整個計算機上只有一個該類型的中心。
優點: 通知的發送者和接受者都不需要知道對方。可以指定接收通知的具體方法。通知名可以是任何字符串。
缺點: 較鍵值觀察需要多點代碼。在刪掉前必須移除監聽者。

上下文通知
如果被觀察屬性是一個NSManagedOjbect的聲明屬性,就可以監聽 NSManagedObjectContextObjectsDidChangeNotification。這仍然使用NSNotification方式 不過有點不同,因爲NSManagedObject不會手動發送通知。
這種方法的註冊如下

[[NSNotificationCenter defaultCenter]      addObserver:listenerObejct      selector:@selector(receivingMethodOnListener:)      name:NSManagedObjectContextObjectsDidChangeNotification      object:observedManagedObjectContext];
在receivingMethodOnListener:中,通知的userinfo中NSInsertedObjectsKey、NSUpdatedObjectsKey和NSDeletedObjectsKey等鍵值會給出受影響的對象集合。

優點: 是在整個NSManagedObjectContext中跟蹤變化的最簡單的方式。
缺點: 僅適用於Core Data並不能提供影響對象之外的具體信息。

用於觀察的委託
最後一個Cocoa簡化的觀察者模式是委託。廣義上說委託可以不僅僅處理簡單的觀察,但不一定需要做更多。
比如,NSApplication和NSWindow所有的通知都會同時傳給委託並由其處理。有些類會傳給它們的委託類似通知的消息,而不同時發送通知。比如NSMenu,發送menuWillOpen:給其委託但不會發送相應的NSNotification。
爲了連接一個委託,只需在支持委託的對象上調用如下代碼:

[object setDelegate:delegateObject];
對象可以收到任何它想要的委託消息。

優點: 支持它的類有詳盡和具體信息。
缺點: 該類必須支持委託。某一時間只能有一個委託連接到某一對象。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章