通过学习KVO,我们发现KVO是一种简单的观察者设计模式,涉及到两个对象,分别是观察者和被观察者。这种方式实质上有很大的局限性,那么OC中的Foundation框架又为开发者提供了新的一种观察者模式,即通知(NSNotification) 通知,是一种发送给一个或者多个观察者,用来通知其在程序中发生了某个事件消息,Cocoa中的通知机制遵循的是一种广播模式。
通知机制的核心就是一个进程中单一实例的对象,叫做通知中心。当一个对象发布一个通知时,通知会先被发布到通知中心。通知中心的作用相当于交流所,作为通知的广播中心。程序中其他需要感知事件的对象通过向通知中心注册就可以达到在事件发生时被通知中心及时通知的目的。
如何建立通知机制? 1、注册相关的监听者,并且实现在需要时候回调方法 2、在需要的时候,被监听者的对象去到通知中心发送消息 3、在“dealloc”方法中,移除通知
例: 创建两个类 PhoneUser(观察者)和Weather(被观察者) 1、注册相关的监听者,并且实现在需要时候回调方法 代码前部[NSNotificationCenter defaultCenter]表示创建一个通知中心,重写初始化方法,这里有四个参数: 参数1:表示观察者本身,常用self 参数2:收到通知后,调用的方法 参数3:收到的通知的名称 参数4:发起通知的对象,一般情况不一定要知道发起者,这里直接写了nil -(id)init { if (self=[super init]) { [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notificationAction:) name:@”weatherAndPhoneUser” object:nil]; } return self; } //定义回调方法,这里实现的是;当调用回调函数时,就将通知的内容输出 -(void)notificationAction:(NSNotification*)notification { NSDictionary *dic=notification.userInfo; NSLog(@”%@”,dic); } //移除通知,这一步是第三步的内容,由于和上面两个方法同属一个文件,现在直接写出来 -(void)dealloc { [[NSNotificationCenter defaultCenter]removeObserver:self]; }
2、在需要的时候,被监听者的对象去到通知中心发送消息; 现在的思路是:当被监听者的一个方法被调用时,就向通知中心发送消息。PS:通知中心是单例的对象,所以在一个工程内,无论是在哪个文件创建或者引用的通知中心对象,都是同一个对象。 在被监听者对象中实现一个方法: 参数1:表示通知的名称 参数2:被监听者本身 参数3:发送的内容 -(void)sendMessage { [[NSNotificationCenter defaultCenter]postNotification**Name**:@”weatherAndPhoneUser “object:self userInfo:@{@”weather”:@”sunny”}]; } 3、然后我们可以在ViewController.m文件中实现整个的通知功能: //创建两个对象 Weather *weather=[[Weather alloc]init]; PhoneUser *phoneUser=[[PhoneUser alloc]init]; //调用被监听者的方法 [weather sendMessage]; //然后监听者,会得到这个通知 并输出
