NSNotification

一、概述

NSNotification顾名思义就是通知的作用,一个对象通知另外一个对象,可以用来传递参数、通信等作用,与delegate的一对一不同,通知是多对多的。在一个对象中注册了通知,那么其他任意对象都可以来对这个对象发出通知。

 

二、NSNotificationCenter

每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信

任何一个对象都可以向通知中心发布通知(NSNotification),描述自己在做什么。其他感兴趣的对象(Observer)可以申请在某个特定通知发布时(或在某个特定的对象发布通知时)收到这个通知

通知与代理的区别:通知是多对多的,代理是一对一的。如下图:

图片 1

比如,键盘弹出的时候也会发送一条通知。

 

三、NSNotification

一个完整的通知一般包含3个属性:

创建一个通知(NSNotification)对象:

实际上创建通知对象并不是必须的,更方便的是通过通知中心发送通知。

 

四、发布通知

通知中心(NSNotificationCenter)提供了相应的方法来帮助发布通知。

获得通知中心对象:

 

通知中心提供的发布通知的方法:

上述为发布一个notification通知,可在notification对象中设置通知的名称、通知发布者、额外信息等。

 

发布一个名称为aName的通知,anObject为这个通知的发布者。

 

发布一个名称为aName的通知,anObject为这个通知的发布者,aUserInfo为额外信息。

当我们添加通知以后,我们就可以发出通知,也是通过NSNotificationCenter类的defaultCenter来获取到通知中心,然后通过postNotificationName来发出通知。这里需要注意的一点就是这样发出的通知是同步操作,也就是只有当发出的通知执行完毕以后才会继续执行接下去的代码:

这是发出通知以后会调用的方法,在多线程操作时,发出通知的对象和接收通知的对象需要处于同一个线程。

 

五、注册通知监听器

通知中心(NSNotificationCenter)提供了方法来注册一个监听通知的监听器(Observer)。

方法1:

observer:监听器,即谁要接收这个通知。

aSelector:收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入,意思是收到通知后调用接收者中的哪个方法。

aName:通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知,意思是监听哪个aName的通知。

anObject:通知发布者。如果为anObject和aName都为nil,监听器都收到所有的通知,意思是监听哪个对象发出的通知。

 

例如,监听输入框内容是否发生改变:

当输入框内容发生改变会自动发送通知,之后会调用我们自定义的textChange方法。

 

方法2:

name:通知的名称。

obj:通知发布者。

queue:决定了block在哪个操作队列中执行,如果传nil,默认在当前操作队列中同步执行。

block:收到对应的通知时,会回调这个block。

 

接下来我们通过一个小demo来看下具体用法(代码比较简单,不再解释,不过这个代码有小问题哦,还没有取消注册监听呢,取消方法后面再讲~):

运行结果:

 

六、取消注册通知监听器

通知中心不会保留(retain)监听器对象,在通知中心注册过的对象,必须在该对象释放前取消注册。否则,当相应的通知再次出现时,通知中心仍然会向该监听器发送消息。因为相应的监听器对象已经被释放了,所以可能会导致应用崩溃。在上面我们的小demo中就没有取消注册监听器

通知中心提供了相应的方法来取消注册监听器:

一般在监听器销毁之前取消注册(如在监听器中加入下列代码):

 

七、NSNotificationQueue

上面说到 NSNotificationCenter是一个同步操作,也就是只有当响应的通知的代码执行完毕以后,发出通知的对象的代码才会继续往下执行。而NSNotificationQueue则与之相反,其通知是异步发送的

NSNotificationQueue:通知队列,用来管理多个通知的调用。通知队列通常以先进先出(FIFO)顺序维护通。NSNotificationQueue就像一个缓冲池把一个个通知放进池子中,使用特定方式通过NSNotificationCenter发送到相应的监听者。

 

创建通知队列方法:

 

往队列加入通知(发送通知)方法:

 

移除队列中的通知方法:

 

发送方式:

NSPostingStyle包括三种类型:

NSPostWhenIdle:空闲发送通知,当运行循环处于等待或空闲状态时,发送通知,对于不重要的通知可以使用。
NSPostASAP:尽快发送通知,当前运行循环迭代完成时,通知将会被发送,有点类似没有延迟的定时器。
NSPostNow :同步发送通知,如果不使用合并通知 和postNotification:一样是同步通知。

 

合并通知:

NSNotificationCoalescing也包括三种类型:

NSNotificationNoCoalescing:不合并通知。
NSNotificationCoalescingOnName:合并相同名称的通知。
NSNotificationCoalescingOnSender:合并相同通知和同一对象的通知。

 

  • 通过合并我们可以用来保证相同的通知只被发送一次。
  • forModes:(nullable NSArray<NSRunLoopMode> *)modes可以使用不同的NSRunLoopMode配合来发送通知,可以看出实际上NSNotificationQueueRunLoop的机制以及运行循环有关系,通过NSNotificationQueue队列来发送的通知和关联的RunLoop运行机制来进行的。

 

八、NSNotificatinonCenter实现原理

  • NSNotificatinonCenter是使用观察者模式来实现的用于跨层传递消息,用来降低耦合度。
  • NSNotificatinonCenter用来管理通知,将观察者注册到NSNotificatinonCenter的通知调度表中,然后发送通知时利用标识符nameobject识别出调度表中的观察者,然后调用相应的观察者的方法,即传递消息(在Objective-C中对象调用方法,就是传递消息,消息有name或者selector,可以接受参数,而且可能有返回值),如果是基于block创建的通知就调用NSNotificationblock
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值