- iOS 提供了一种 "同步的" 消息通知机制,观察者只要向消息中心注册, 即可接受其他对象发送来的消息,消息发送者和消息接受者两者可以互相一无所知,完全解耦。这种消息通知机制可以应用于任意时间和任何对象,观察者可以有多个,所以消息具有广播的性质,只是需要注意的是,观察者向消息中心注册以后,在不需要接受消息时需要向消息中心注销,这种消息广播机制是典型的“Observer”模式。
- 使用场合:
消息机制常常用于在向服务器端请求数据或者提交数据的场景,在和服务器端成功交互后,需要处理服务器端返回的数据,或发送响应消息等,就需要用到消息机制。 - 使用消息机制的步骤:
(1)观察者注册消息通知
// 在需要接收通知消息的.m文件中写入
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(logOutSuccess:) name:@"isLogOutSuccess" object:nil];
notificationObserver 观察者 : self
notificationSelector 处理消息的方法名: logOutSuccess:
notificationName 消息通知的名字: isLogOutSuccess
notificationSender 消息发送者 : 表示接收哪个发送者的通知,如果第四个参数为nil,接收所有发送者的通知
(2) 发送消息通知
// 在需要发送数据的.m文件中写入
[[NSNotificationCenter defaultCenter] postNotificationName:@"isLogOutSuccess" object:returnMsg];
// 这个比第一个多了个参数就是userInfo(参数类型是字典)
[[NSNotificationCenter defaultCenter] postNotificationName:@"isLogOutSuccess" object: returnMsg userInfo:[NSDictionary dictionaryWithObject:@"value" forKey:@"key"]];
notificationName 消息通知的名字: isLogOutSuccess
notificationSender 消息发送者: returnMsg
userInfo 消息传递的数据信息:可以写入nil
(3)观察者处理消息
// 在注册通知的控制器中写入该方法
-(void) isLogOutSuccess:(NSNotification*)notification{
NSString *nameString = [notification name];
NSString *objectString = [notification object];
NSDictionary *dictionary = [notification userInfo];为nil要有这行代码哦
// 当你拿到这些数据的时候你可以去做一些操作
}
NSNotification 接受到的消息信息,主要含:
Name: 消息名称 isLogOutSuccess
object: 消息发送者 returnMsg
userInfo: 消息传递的数据信息
观察者注销,移除消息观察者
虽然在 IOS 用上 ARC 后,不显示移除 NSNotification Observer 也不会出错,但是这是一个很不好的习惯,不利于性能和内存。
- 注销观察者有2个方法:
1、 最优的方法,在 UIViewController.m 中:
-(void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
If you see the method you don't need to call [super dealloc]; here, only the method without super dealloc needed.
2、单个移除
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"isLogOutSuccess" object:nil];