什么是通知?
通过学习KVO 我们发现KVO是一种简单的观察者设计模式,涉及到两个对象,分别是观察者和被观察者.这种方式实质有很大的局限性.那么OC中的”Foundstion”框架又为开发者提供了一种观察者设计模式.即通知**通知,是一种发送给一个或者多个观察者,用来通知其在程序中发生了某个事件的消息,COcoca中的通知机制遵循的就是一种广播的模式,他是一种程序中事件的发起者或者处理者和其他想要知道该事件的对象沟通的一种方式,消息的接收者,也就是观察者响应该事件来改变自己的UI,行为或者状态
在OC中,使用NSNotification类来表示一个通知**
- 建立通知的发送机制,如下:
1.注册相关的监听者,并且实现在需要的时候回调收到通知时的方法
2.在需要的时候被监听者的对象去到通知中心发送消息
3.在delloc方法里面移除通知
概念了解到这里,那么我们上代码
在main.m函数里面创建一个通知中心:
// 创建一个通知中心 单例类,拿到通知中心的单例类
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
然后新建一个依然是我们用的万能的Student类;
在Student的.m文件中重写init方法,并且注册一个通知的监听者
#import "Student.h"
@implementation Student
//重写init方法
-(id)init{
if (self = [super init]) {
// 注册通知的监听者
/*
1.要去接收通知的对象
2.接收到某个通知要回调的相应方法
3.接收通知的名字
4.发起通知的对象,一般写nil,对于通知来说,一般不需要知道谁是通知的发起者
*/
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notificationAction:) name:@"通知名称2" object:nil];
}
return self;
}
重写一下,监听者监听到通知之后回调的方法
//监听到通知之后回调的方法
-(void)notificationAction:(NSNotification *)notification{
NSLog(@"%@",notification.userInfo);
}
最重要的一步,不要忘了移除监听者
-(void)dealloc{
// 移除某个通知的监听者
// [[NSNotificationCenter defaultCenter]removeObserver:self name:@"通知名称2" object:nil];
// 移除所有通知的监听者
[[NSNotificationCenter defaultCenter]removeObserver:self];
NSLog(@"移除了");
}
回到main.m函数中导入Student的头文件,创建对象调用并且输出
Student *stu = [Student new];
//发送通知
[center postNotificationName:@"通知名称2" object:stu userInfo:@{@"center":@"MaDeZhiZhang"}];
输出结果如下: