在进行复杂的消息通知或者数据、事件传递时,我们常用代理、block、通知中心等方法来实现
下面就介绍一下基本的通知与监听事件的实现。
首先我们看一下实现方法调用到的语法
//注册一个通知事件 包括名称 执行对象 相关传递信息
[[NSNotificationCenter defaultCenter]postNotificationName:@"监听事件" object:self userInfo:dictonary];
/*postNotificationName 这个通知事件的名称
/*object 这个通知的执行对象
/*userInfo 这个通知想要传递的相关数据(字典)
//创建一个监听事件,接收通知并执行相关操作
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(getNSNotificationAndDoSomething:) name:@"监听事件" object:nil];
/*addObserver 这个监听的执行对象
/*selector 接收到通知后需要执行的相关方法
/*name 只接收指定的那个通知的名称
/*object 一般nil
PS:这个函数中 selector方法后面的函数会获取到通知中心传递过来的userInfo数据:
-(void)getNSNotificationAndDoSomething:(NSNotification *)userInfoDictionary{
NSString *tex=userInfoDictionary.userInfo[@"name"];
Dlog(tex);
}
//事件结束后 需要移除监听事件
[[NSNotificationCenter defaultCenter]removeObserver:self name:@"监听事件" object:nil];
参数同上
下面就通过事例流程来执行以上方法
我们A控制器下跳转到B控制器 ,当跳转成功后 我们就注册一个通知(使用函数1) 。并在A控制器下创建一个监听者 (使用函数2)当监听到跳转成功时,在A控制器下输出对应的内容。最后记得在-(void)dealloc里移除监听事件(函数3)。
使用通知有许多的优势,首先代码量相比较代理等方法更少,其次通知者和监听者之间无必然联系,不像代理一样需要一一对应执行方法和对象。另外代理是一对一的关系而通知是一对多的关系,一个通知可以有无数个在不同位置的监听者。但是代理的优势也是不可取代的。
监听可以用在一些简单常用的回调、状态监测等事件上。例如付款、下单状态、实时网络状态等。或者键盘监听等等。
coacoa系统中就有许多不同名称的监听事件,例如:
本文中使用的是默认的通知中心,我们也可以自定义一个通知中心来注册通知事件
NSNotificationCenter *notificationCenter = [[NSNotificationCenter alloc]init];
他所发出的通知只会在当前的 NotificationCenter 中进行,不同的 NotificationCenter 之间的通知互不相干。