通知中樞是 Foundation 架構的一個子系統,它嚮應用程式中註冊為某個事件觀察者的所有對象廣播訊息(即通知)。(從編程角度而言,它是 NSNotificationCenter
類的執行個體)。該事件可以是發生在應用程式中的任何事情,例如進入後台狀態,或者使用者開始在文本欄中鍵入。通知是告訴觀察者,事件已經發生或即將發生,因此讓觀察者有機會以合適的方式響應。通過通知中樞來傳播通知,是增加應用程式物件間合作和內聚力的一種途徑。
任何對象都可以觀察通知,但要做到這一點,該對象必須註冊,以接收通知。在註冊時,它必須指定選取器,以確定由通知傳送所調用的方法;方法簽名必須只有一個參數:通知對象。註冊後,觀察者也可以指定發布對象。
(以上是官方文檔中的解釋)
------------------------------------------華麗的分割線----------------------------------------------------------
通知中樞包括兩個重要的類:
(1)NSNotificationCenter:
實現NSNotificationCenter的原理是一個觀察者模式,獲得NSNotificationCenter的方法只有一種,那就是[NSNotificationCenter
defaultCenter] ,通過調用靜態方法defaultCenter就可以擷取這個通知中樞的對象了,而NSNotificationCenter是一個單例模式,而這個通知中樞的對象會一直存在於一個應用的生命週期。
(2)
NSNotification: 這是訊息攜帶的載體,通過它,可以把訊息內容傳遞給觀察者。
(3)一個NSNotificationCenter可以有許多的通知訊息NSNotification,對於每一個NSNotification可以有很多的觀察者Observer來接收通知。
通過上面的介紹可以知道,通過通知中樞也可以實現不同類之間的參數傳遞。
注意當接受到訊息後,不想再收到訊息了,要把observer刪除remove。
下面介紹如何使用(具體解釋看文檔)。
(1)NSNotification
:用於建立傳遞的訊息
Creating Notifications+ notificationWithName:object:+ notificationWithName:object:userInfo:Getting Notification Information– name– object– userInfo
(2)NSNotificationCenter :用於發送訊息
Getting the Notification Center+ defaultCenterManaging Notification Observers– addObserverForName:object:queue:usingBlock:– addObserver:selector:name:object:– removeObserver:– removeObserver:name:object:Posting Notifications– postNotification:– postNotificationName:object:– postNotificationName:object:userInfo:
demo(例子中基本上涉及到以上所有的方法了):
定義了兩個類:Poster(發送訊息)和Observer(接受訊息)
Poster.h
#import <Foundation/Foundation.h>@interface Poster : NSObject-(void)postMessage;@end
Poster.m
#import "Poster.h"@implementation Poster-(void)postMessage{ //1.下面兩條語句等價 //二者的區別是第一條語句是之間發送訊息內容,第二條語句先建立一個訊息,然後再發送訊息 [[NSNotificationCenter defaultCenter] postNotificationName:@"PosterOne" object:@"This is posterone!"]; // [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"PosterOne" object:@"This is posterone"]]; //2.下面兩條語句等價 //參數:userInfo --- Information about the the notification. [[NSNotificationCenter defaultCenter] postNotificationName:@"PosterTwo" object:@"This is postertwo" userInfo:[NSDictionary dictionaryWithObject:@"value" forKey:@"key"]]; // [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"PosterTwo" object:@"This is postertwo" userInfo:[NSDictionary dictionaryWithObject:@"value" forKey:@"key"]]];}@end
Observer.h
#import <Foundation/Foundation.h>@interface Observer : NSObject-(void)observer;@end
Observer.m
#import "Observer.h"@implementation Observer-(void)observer { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callBack1:) name:@"PosterOne" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callBack2:) name:@"PosterTwo" object:nil]; //刪除所有的observer// [[NSNotificationCenter defaultCenter] removeObserver:self]; //刪除名字為name的observer// [[NSNotificationCenter defaultCenter] removeObserver:self name:@"PosterOne" object:nil]; }-(void)callBack1:(NSNotification*)notification{ NSString *nameString = [notification name]; NSString *objectString = [notification object]; NSLog(@"name = %@,object = %@",nameString,objectString);}-(void)callBack2:(NSNotification*)notification{ NSString *nameString = [notification name]; NSString *objectString = [notification object]; NSDictionary *dictionary = [notification userInfo]; NSLog(@"name = %@,object = %@,userInfo = %@",nameString,objectString,[dictionary objectForKey:@"key"]);}@end
main.m
#import <Foundation/Foundation.h>#import "Poster.h"#import "Observer.h"int main(int argc, const char * argv[]){ @autoreleasepool { //注意這裡的順序,要先observer,然後再poster Observer *myObserver = [[Observer alloc] init]; [myObserver observer]; Poster *poster = [[Poster alloc] init]; [poster postMessage]; } return 0;}
好了,大概有關的內容都差不多了吧
附:
不過有個方法
addObserverForName:object:queue:usingBlock:
還不太懂如何使用,暫時放一下,有知道了麻煩評論告訴了。