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