NSNotification的結(jié)構(gòu)
點(diǎn)進(jìn)NSNotification類中進(jìn)去,可以看到他的基本屬性和一些方法。
//消息的唯一標(biāo)示,用來(lái)區(qū)分各個(gè)消息,也就是說(shuō)具有唯一性。
@property (readonly, copy) NSNotificationName name;
//這個(gè)成員變量定義一個(gè)對(duì)象,可以理解為針對(duì)某一個(gè)對(duì)象的消息,也可以進(jìn)行傳值。
@property (nullable, readonly, retain) id object;
//這個(gè)字典可以進(jìn)行傳值。把你需要的參數(shù)傳出去。
@property (nullable, readonly, copy) NSDictionary *userInfo;
初始化方式
通知中心的創(chuàng)建,是以單例的形式創(chuàng)建。
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;
其中第一個(gè)參數(shù),是向通知中心添加觀察者。第二個(gè)參數(shù),是接受到通知后相應(yīng)的事件,第三個(gè)參數(shù)是消息的唯一標(biāo)示。第四個(gè)參數(shù)是用于接收固定對(duì)象的通知。如果填寫(xiě),則在對(duì)象發(fā)送通知時(shí),也需要設(shè)置一致的固定對(duì)象。一般填寫(xiě)nil。接收所有對(duì)象發(fā)送的通知。
發(fā)送通知的方法有兩個(gè),對(duì)應(yīng)三種情況。
無(wú)userInfo
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject;
很簡(jiǎn)單,將通知中心的唯一標(biāo)示填進(jìn)去就可以了,anObject可填寫(xiě)(有參),可不填寫(xiě)(無(wú)參),
在響應(yīng)通知的方法里,用object去接收參數(shù)。如果用userInfo去接受的話。userInfo則為nil。
有userInfo
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
可將需要的參數(shù)放入aUserInfo的字典中。在響應(yīng)通知的方法中用userInfo去接受參數(shù)。
通知的應(yīng)用
下面舉個(gè)代碼例子
控制器A
//創(chuàng)建通知中心
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(gotoHomeView:) name:@"NgotoHomeView" object:nil];
//響應(yīng)方法
- (void)gotoHomeView: (NSNotification *)sender {
NSInteger number = [[sender.userInfo valueForKey:@"number"] integerValue];
}
<控制器B
//發(fā)送通知
[[NSNotificationCenter defaultCenter]postNotificationName:@"NgotoHomeView" object:nil userInfo:@{@"number": @"0"}];
當(dāng)在控制器B里觸發(fā)發(fā)送通知的方法,則在控制器A中會(huì)接收到通知,前提是A控制器已經(jīng)創(chuàng)建。
需要注意點(diǎn)
最后通知中心需要移除,原則是在哪創(chuàng)建,在哪移除。上面的例子就是在控制器A中移除。保險(xiǎn)起見(jiàn)將一處方法寫(xiě)在dealloc方法中,所以上面的例子還差一步
- (void)dealloc {
[[NSNotificationCenter defaultCenter]removeObserver:@”NgotoHomeView“];
}
最后需要注意的是如果創(chuàng)建通知中心時(shí),object參數(shù)沒(méi)有為空,則在發(fā)送通知的方法中,參數(shù)object應(yīng)保持一致。否則將接收不到通知。