图片.png
- 通知基础
NSNotificationCenter 是iOS中一个调度消息通知的类,采用单例模式设计,在程序中实现传值、回调等地方应用很广。在iOS中,NSNotification是使用观察者模式来实现的用于跨层传递消息。往往也用NSNotification来实现解耦的目的。
它的实质是程序内部提供的一种广播机制。把接受到的消息根据内部消息转发出去,将消息转发给需要的对象。
通知这种传值方式一般用于一对多的情况,iOS中常见的还有代理传值、block传值等。代理实现和block一般用于一对一的情况。
- 接收通知的线程,和发送通知所处的线程是同一个线程。也就是说如果如果要在接收通知的时候更新UI,需要注意发送通知的线程是否为主线程。
通知中的数据结构
NSNotification:
字段名 含义
name 通知的名称,用于通知的唯一标识
object 保存发送通知的对象
userinfo 保存给通知接受者传递的额外信息
NSNotification是一个类簇(nsnumber就是个类簇,对各种数据包装,具体的实现都隐藏起来,没有init,具体有包的实现),不能通过init实例化,比如NSNotification *notif = [[NSNotification alloc]init];这样会引起下面的异常。
图片.png
但是可以通过装饰构造方法创建实例对象,装饰构造方法如下。
:- initWithName:(NSNotificationName)name object:(nullable id)object userInfo:(nullable NSDictionary *)userInfo;
- 如果想要附加更多信息在NSNotification中,可以子类化NSNotification,额外新加的字段。需要注意的一点就是虽然可以自己去实现装饰构造方法,但是切记在自定义的装饰构造方法中不要调用[super init]。
NSNotificationCenter
NSNotificationCenter提供了一套机制来发送通知,本质上来NSNotificationCenter其实就是一个通知派发表。
addObserver:selector:name:object:
参数object表示的是观察者只会接受来至object对象发出的所注册的通知。而不会接受其他对象发送的所注册的通知。
方法addObserverForName:object:queue:usingBlock:。因为平时这个用得不是特别多。相比addObserver:selector:name:object:这种方式添加通知,多了个queue和block。这里的queue就是决定将block提交到哪个队列里面执行(不是注册方法,相当于是接受通知后的操作直接写到block里面了)。通知接收和发送的线程是同一个。常见的会把这个queue设置为主队列,因为主队列的任务都会在主线程下完成,所以可以用这种方式来实现通知更新UI。而不使用注册SEL的方式。
NSNotificationQueue
-
NSNotificationQueue在NSNotificationCenter起到了一个缓冲的作用。尽管NSNotificationCenter已经分发通知,但放入队列的通知可能会延迟,直到当前的runloop结束或runloop处于空闲状态才发送。具体策略是由后面的参数决定。
-
如果有多个相同的通知,可以在NSNotificationQueue进行合并,这样只会发送一个通知。NSNotificationQueue会通过先进先出的方式来维护NSNotification的实例,当通知实例位于队列首部,通知队列会将它发送到通知中心,然后依次的像注册的所有观察者派发通知。
-
每个线程有一个默认和 default notification center相关联的的通知队列。
图片.png
通过调用initWithNotificationCenter和外部的NSNotificationCenter关联起来,最终也是通过NSNotificationCenter来管理通知的发送、注册。除此之外这里有两个枚举值需要特别注意一下。
NSPostingStyle:用于配置通知什么时候发送
NSPostASAP:在当前通知调用或者计时器结束发出通知
NSPostWhenIdle:当runloop处于空闲时发出通知
NSPostNow:在合并通知完成之后立即发出通知。
NSNotificationCoalescing(注意这是一个NS_OPTIONS):用于配置如何合并通知
NSNotificationNoCoalescing:不合并通知
NSNotificationNoCoalescing:按照通知名字合并通知
NSNotificationCoalescingOnSender:按照传入的object合并通知
图片.png










网友评论