通知的使用方式:
1.注册通知
2.发送通知
3.实现通知监听的方法
4.移除通知
我对于通知的理解和困惑:好处就是解耦,给代码分层,任何两个类之间都可以使用通知来传递参数和实现一些业务逻辑,和代理,KVO有异曲同工之妙。个人认为通知会比代理写代码的时候简单很多,但是有的时候会不知道在什么时机去移除通知。如果在控制器之间,明确知道生命周期的时候,使用通知是比较高效的,因为知道何时注册通知,发送通知和移除通知。在单例对象中,最好不要注册通知,因为单例在整个程序的运行过程中都是不会销毁的,导致注册的通知的也无法移除,会出现未知BUG。比如你注册了多个同样Name的通知,而且多次发送通知,会造成崩溃。
还有在键盘的通知使用中,要在viewWillAppear
中add通知,在viewWillDisappear
中remove 通知,因为viewWillAppear
和viewWillDisappear
这个方法会调用多次,当触发侧滑返回时会调用系统自带的viewWillDisappear:方法,要是这时候用户取消了侧滑返回(即回侧滑到一半又松手了), 这个时候如果移除了键盘通知就收不到键盘通知了,所以要在viewWillAppear
再次重新注册键盘通知,才能防止用户这种刁钻操作影响了键盘的正常使用。
通知的类型:
有参和无参的区别就是在 发送通知的时候是否给通知中心传递参数,参数名是——userInfo
1.无参
[[NSNotificationCenter defaultCenter] postNotificationName:@"Notification_name" object:userProfile userInfo:没有参数,这里就是空];
没有参数的使用方法:
//发送通知
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"loadH5code" object:nil userInfo:nil]];
//注册通知:
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(loadH5code) name:@"loadH5code" object:nil];
//实现监听方法
-(void)loadH5code{
// do something
}
2.有参
[[NSNotificationCenter defaultCenter] postNotificationName:@"Notification_name" object:userProfile userInfo:有参数,参数类型是NSDictionary];
所以命名参数的格式为
NSDictionary *dict = @{@"key":@"value"};
这是整个有参数的通知使用方法:
//发送通知
NSDictionary *dict = @{@"key":@"value"};
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"loadH5code" object:nil userInfo:dict]];
//注册通知:
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(loadH5code:) name:@"loadH5code" object:nil];
//实现监听方法
-(void)loadH5code:(NSNotification *)notification
{
NSString *loadPathStr = notification.userInfo[@"key"];
if ([h5PathStr isEqualToString:@"value"]) {
// do something
}
}
最后就是移除通知了(切记要移除,不然有意想不到的欲罢不能欲仙欲死的bug)
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"loadH5code" object:self];