iOS中的NSNotificationCenter
NSNotificationCenter就像中央枢纽,在该枢纽中,应用程序的任何部分都会发布和接收通知
注册
注册n次通知,您将收到n次通知
debugDescription
从iOS 9+开始,
现在,从调试器进行打印时,NSNotificationCenter和NSDistributedNotificationCenter将提供调试描述,该调试描述将列出所有已注册的观察者,包括已被调零以帮助调试通知注册的引用。 该数据仅在断点期间有效,因为基础存储必须考虑多线程环境。 传递给addObserver方法族的名称或对象为null的通知通配符注册将在调试描述中显示为*。
观察者
addObserver(_:selector:name:object 🙂
使用观察者,通知选择器和可选条件(通知名称和发送者)将条目添加到接收者的分发表中。
-
NSNotificationCenter
对其观察者的引用微弱 - 常规通知中心在发布通知的线程上传递通知
addObserverForName(_:object:queue:usingBlock 🙂
使用通知队列和要添加到队列的块以及可选条件:通知名称和发送者,将条目添加到接收者的调度表中。
- 此方法返回的是充当观察者的不透明对象,并且
NSNotificationCenter
拥有对该对象的强引用 - 避免强烈捕获块中的对象。 请参阅NSNotificationCenter,其中包含被认为有害的块
什么时候注销?
我们的想法是在我们不需要接收通知时立即注销。 大多数时候,这是我们的`deinit`
请参阅注销观察者
在取消分配观察通知的对象之前,它必须告诉通知中心停止向其发送通知。 否则,下一个通知将发送到不存在的对象,并且程序崩溃
iOS 9+
参见OS X 10.11和iOS 9发行说明Cocoa Foundation Framework
在OS X 10.11和iOS 9.0中,NSNotificationCenter和NSDistributedNotificationCenter将不再向可能释放的已注册观察者发送通知
这意味着不需要观察者注销其释放方法
然而,
当不再使用时,通过-[NSNotificationCenter addObserverForName:object:queue:usingBlock]方法的基于块的观察者仍然需要取消注册,因为系统仍然对这些观察者保持强烈的引用
所以我们必须在返回的`observer`对象上调用`removeObserver`
https://gist.github.com/onmyway133/9ce293862999c3e5eb205d33923b881e
同步性
通知中心将通知同步发送给观察者。 换句话说,发布通知时,控件不会返回到发布者,直到所有观察者都收到并处理了通知
如果您在向大量观察者发布通知时遇到性能问题,请考虑使用
- dispatch_after
- 许多
NSNotificationCenter
-
NSNotificationQueue
NSNotificationQueue
–排队方法立即返回
–与运行循环模式关联
–当前线程有一个“ defaultQueue”
参考
- 通知编程主题
- NSNotificationCenter具有被认为有害的块
- 委托或通知
- 2010–01–08,星期五问答:NSNotificationQueue