成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解Cocoa中監聽、觀察和通知五種方法

移動開發 iOS
Cocoa中監聽、觀察和通知五種方法是本文要介紹的內容,本文介紹Objective C中實現觀察者模式(也被稱為廣播者/監聽者、發布/注冊或者通知)的五種方法以及每種方法的價值所在。

Cocoa中監聽、觀察和通知五種方法是本文要介紹的內容,本文介紹Objective C中實現觀察者模式(也被稱為廣播者/監聽者、發布/注冊或者通知)的五種方法以及每種方法的價值所在。該文章將包括:

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

2、鍵-值觀察(Key Value Observing)

3、通知中心(Notification center)

4、上下文通知(Context notification)

5、用于觀察的委托(Delegate)

關于觀察者

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

手動廣播者和監聽者

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

在廣播者類上你可能需要一個NSMutableArray、NSSet或NSMutableDictionary。NSMutableDictionary比較適合將事件標識符的類型作為每個監聽者的鍵值。在廣播者上你還需要有監聽者注冊和取消注冊的方法。

給NSArray或NSSet中的每個對象方式消息的方法很簡單,如下:

  1. [listenersCollection makeObjectsPerformSelector:@selector(methodSupportedByEveryListener)]; 

更多信息參見: Collections Programming Topics for Cocoa

優點: 廣播者對監聽者列表有完全的控制。

缺點: 在集合中手動添加或移除監聽者(尤其是在由于其他原因已經不被維護的情況下)。如果需要發布不同消息的情況下就需要更多的手動工作。

鍵值觀察

鍵值觀察協議時朝著自動化如上過程方向的一個很大進步。在很多情況下,廣播者不需要做任何事情。

每個Cocoa對象自動處理用于發布任何對象的addObserver:forKeyPath:options:context:。如果廣播者的“setter”方法遵循某些規則,“setter”方法就會自動觸發任何監聽者的observeValueForKeyPath:ofObject:change:context:方法。  
例如如下代碼就會在“source”對象上加入一個觀察者::

  1. [source      addObserver:destination        
  2.    forKeyPath:@"myValue"     options:NSKeyValueChangeNewKey        
  3.     context:nil];       

這樣在每次調用setMyValue:方法的時候都會發送一個observeValueForKeyPath:ofObject:change:context:消息到destination。     

你所需要做的就是在被觀察對象上注冊監聽者并讓監聽者實現

  1. observeValueForKeyPath:ofObject:change:context: 

更多信息參見:NSKeyValueObserving Protocol Reference     

優點: 內置的而且是自動的。可以觀察任何鍵路徑。支持依賴通知。     

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

通知中心     

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

發送通知的代碼如下:

  1. [[NSNotificationCenter defaultCenter]        
  2. postNotificationName:@"myNotificationName"     object:broadcasterObject];         

注冊接收通知的代碼如下:

  1.    
  2. [[NSNotificationCenter defaultCenter]      addObserver:listenerObject       
  3.  selector:@selector(receivingMethodOnListener:)      name:@"myNotificationName"     object:nil];   

 

注冊通知的時候可以指定一個具體的廣播者對象,但這不是必須的。你可能注意到了defaultCenter 。實際上這是你在應用中會使用到的唯一的中心。通知會向整個應用開放,因此只有一個中心。     

同時還有一個NSDistributedNotificationCenter。這是用來應用間通信的。在整個計算機上只有一個該類型的中心。     

更多信息請參見:Notification Programming Topics for Cocoa     

優點: 通知的發送者和接受者都不需要知道對方。可以指定接收通知的具體方法。通知名可以是任何字符串。     

缺點: 較鍵值觀察需要多點代碼。在刪掉前必須移除監聽者。

上下文通知   

如果被觀察屬性是一個NSManagedOjbect的聲明屬性,就可以監聽

  1. NSManagedObjectContextObjectsDidChangeNotification 

這仍然使用NSNotification方式不過有點不同,因為NSManagedObject不會手動發送通知。

這種方法的注冊如下

  1. [[NSNotificationCenter defaultCenter]        
  2. addObserver:listenerObejct      selector:@selector(receivingMethodOnListener:)        
  3. name:NSManagedObjectContextObjectsDidChangeNotification   
  4.          object:observedManagedObjectContext];       

在receivingMethodOnListener:中,通知的userinfo中NSInsertedObjectsKey、NSUpdatedObjectsKey和NSDeletedObjectsKey等鍵值會給出受影響的對象集合。

更多信息請參見NSManagedObjectContext Class Reference      

優點: 是在整個NSManagedObjectContext中跟蹤變化的最簡單的方式。      

缺點: 僅適用于Core Data并不能提供影響對象之外的具體信息。用于觀察的委托     

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

  1. [object setDelegate:delegateObject];       

對象可以收到任何它想要的委托消息。    

更多信息請參見:Cocoa Fundamentals Guide: Delegates and Data Sources     

優點: 支持它的類有詳盡和具體信息。     

缺點: 該類必須支持委托。某一時間只能有一個委托連接到某一對象。

小結:詳解Cocoa中監聽、觀察和通知五種方法的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: starming社區
相關推薦

2021-11-02 07:54:40

List分片Java

2020-08-06 13:19:10

IBM多云管理

2020-12-03 14:40:10

云管理

2020-07-24 20:45:51

Spark數據集函數

2022-12-07 11:24:51

首席信息官IT

2009-07-03 17:48:24

JSP頁面跳轉

2011-03-15 14:16:27

2025-04-25 08:55:00

Pod運維

2021-08-27 16:26:11

敏感數據

2022-12-29 08:46:15

IT采購投資

2011-08-15 14:27:51

CocoaRunLoop

2009-02-17 10:40:26

頁面跳轉JSP教程

2019-07-31 08:44:27

Session共享Memcache

2015-09-10 09:30:54

Java多線程同步

2020-04-02 10:45:48

多云云計算云平臺

2022-11-23 13:46:02

云支出云計算

2011-04-21 10:08:34

2022-01-10 06:52:59

查詢MySQL字段

2023-08-11 11:29:48

物聯網制造業

2015-10-08 09:36:18

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线视频免费观看 | 四虎永久免费地址 | 久草在线中文888 | 岛国毛片 | 日韩免费视频一区二区 | 欧美另类视频 | 99热视 | 国产精品视频久久 | 国产999精品久久久久久绿帽 | 亚洲天堂男人的天堂 | 久久久久无码国产精品一区 | 国产午夜精品久久久 | 成年免费大片黄在线观看一级 | 国产精产国品一二三产区视频 | 亚洲高清电影 | 精品国产精品国产偷麻豆 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 国产精品久久久久久久一区二区 | 九色.com | 久久久免费在线观看 | 99色综合| 一区日韩| 中文字幕高清av | 产真a观专区 | 欧美在线视频一区二区 | 国产欧美一区二区三区久久手机版 | 欧美激情第一区 | 一区亚洲| 国产激情在线播放 | www.国产精品| 一区二区三区视频在线免费观看 | h视频在线播放 | 在线观看免费黄色片 | 久久久久久久久久久久久久国产 | 国产精品大片 | 福利社午夜影院 | 欧美日韩高清在线观看 | 九九热这里| 日韩精品一区二区三区 | 2021天天躁夜夜看 | 日本在线免费观看 |