Notification - Swift 3.0

What?

使用一个东西之前首先要了解它是什么,做什么的.
通知:

NSNotification objects encapsulate information so that it can be broadcast to other objects by an NSNotificationCenter object.
通知对象可以携带信息,所以它能被通知中心广播给其他对象
 An NSNotification object (referred to as a notification) contains a name, an object, and an optional dictionary. 
通知包含: 通知名称,通知对象,和可选的携带信息的字典
The name is a tag identifying the notification.
①通知名称: 唯一标识一个通知对象.
The object is any object that the poster of the notification wants to send to observers of that notification (typically, it is the object that posted the notification).
②通知对象: 一个通知的poster发送者想要将通知传递的观察者,
The dictionary stores other related objects, if any. NSNotification objects are immutable objects.
③字典存储相关信息 . 通知为不可变对象.

通知是一种消息通知机制 a mechanism for broadcasting information within a program
使用通知的场景经常是为了模块间的解耦.
一般如果模块的关联性很强的话,不建议使用通知, 因为可读性会变差,调试困难.

Bugs

Add & Remove

使用通知时的一个注意事项就是 ,有添加通知的观察者,就要在适当的时机移除该观察者对该通知的观察.
这是因为:

NSNotification : A 
ObservorO : B
NSNotificationCenter : C

如果像通知中心C 注册了一个观察通知A的观察者B ,这时通知中心一般会 记录下观察者B的内存地址.
当观察者被销毁的时候,如果这时候不移除他这个观察者的话, 此时发送一个通知A, 则通知中心会查询dispatch table,根据已经记录的 B的内存地址 发送这个通知A. 结果就是 经典野指针错误.

建议:根据你的使用逻辑添加和移除通知为好.

  • 如果你希望在整个观察者的生命周期中都要进行通知的收发操作, 建议创建该观察者的时候 add,观察者销毁的时候remove
  • 如果你只希望在视图显示的时候处理通知逻辑,在视图消失的时候不进行处理的话, 那么就在viewWillAppearaddObserverviewWillDisappearremoveObserver就可以了.记得要成对出现.

通知的同步处理机制

这意味着, 发送通知和观察通知并处理通知为同一个线程,在通知的发送过程中,通知中心会查找到相关的Observer的selector逐个被执行,当全部执行完毕时,通知才发送完毕。
注意点: 观察者处理UI事件要回到主线程, 发送通知处的代码会被阻塞,直到观察者处理完任务.

参考

nsnotification避坑指南
iOS NSNotificationCenter 使用姿势详解

你可能感兴趣的:(Notification - Swift 3.0)