NSNotification的结构
点进NSNotification类中进去,可以看到他的基本属性和一些方法。
//消息的唯一标示,用来区分各个消息,也就是说具有唯一性。
@property (readonly, copy) NSNotificationName name;
//这个成员变量定义一个对象,可以理解为针对某一个对象的消息,也可以进行传值。
@property (nullable, readonly, retain) id object;
//这个字典可以进行传值。把你需要的参数传出去。
@property (nullable, readonly, copy) NSDictionary *userInfo;
初始化方式
通知中心的创建,是以单例的形式创建。
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;
其中第一个参数,是向通知中心添加观察者。第二个参数,是接受到通知后相应的事件,第三个参数是消息的唯一标示。第四个参数是用于接收固定对象的通知。如果填写,则在对象发送通知时,也需要设置一致的固定对象。一般填写nil。接收所有对象发送的通知。
发送通知的方法有两个,对应三种情况。
无userInfo
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject;
很简单,将通知中心的唯一标示填进去就可以了,anObject可填写(有参),可不填写(无参),
在响应通知的方法里,用object去接收参数。如果用userInfo去接受的话。userInfo则为nil。
有userInfo
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
可将需要的参数放入aUserInfo的字典中。在响应通知的方法中用userInfo去接受参数。
通知的应用
下面举个代码例子
控制器A
//创建通知中心
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(gotoHomeView:) name:@"NgotoHomeView" object:nil];
//响应方法
- (void)gotoHomeView: (NSNotification *)sender {
NSInteger number = [[sender.userInfo valueForKey:@"number"] integerValue];
}
<控制器B
//发送通知
[[NSNotificationCenter defaultCenter]postNotificationName:@"NgotoHomeView" object:nil userInfo:@{@"number": @"0"}];
当在控制器B里触发发送通知的方法,则在控制器A中会接收到通知,前提是A控制器已经创建。
需要注意点
最后通知中心需要移除,原则是在哪创建,在哪移除。上面的例子就是在控制器A中移除。保险起见将一处方法写在dealloc方法中,所以上面的例子还差一步
- (void)dealloc {
[[NSNotificationCenter defaultCenter]removeObserver:@”NgotoHomeView“];
}
最后需要注意的是如果创建通知中心时,object参数没有为空,则在发送通知的方法中,参数object应保持一致。否则将接收不到通知。