NSNotification
的原理是通过NSNotificationCenter
发送消息,从而所有监听了这些信息的对象都能收到消息,从而作出反应.
NSNotification和KVO的区别
KVO通常在需要观察某个对象的特定变化的时候使用,而NSNotification通常用于追踪特定的事件(例如用户停止滑动table).
KVO不是使用NSNotification实现的.KVO的实现是通过运行时实现的.
NSNotificationCenter
NSNotificationCenter
提供了一个广播消息的机制.每一个正在运行的Cocoa 程序都有一个NSNotificationCenter对象(单例模式).一般不需要创建自己的程序都有一个NSNotificationCenter对象.如果需要监听其他进程的消息或者向其他进程广播消息,可以使用NSDistributedNotificationCenter
.
使用NSNotification
创建一个通知对象
1 2
| convenience init(name aName: String, object anObject: AnyObject?)
|
1 2 3
| init(name name: String, object object: AnyObject?, userInfo userInfo: [NSObject : AnyObject]?)
|
参数 |
描述 |
name |
通知的名字,不能为空. |
object |
指定消息的发送者. |
注册通知
1 2 3 4
| func addObserver(_ observer: AnyObject, selector aSelector: Selector, name aName: String?, object anObject: AnyObject?)
|
参数 |
描述 |
Observer |
指定观察者,不能为空. |
Selecter |
指定接受消息后调用的方法.该方法必须只有一个NSNotification 的参数. |
Name |
指定观测的notification的名字.指定后只接受对应名字的消息.如果Name为nil,则接受所有名字的notification. |
Sender |
指定消息的发送者.可以为nil.如果为nil则接受所有发送者的消息. |
发送通知
发送通知有两种方法:
1
| func postNotification(_ notification: NSNotification)
|
1 2
| func postNotificationName(_ aName: String, object anObject: AnyObject?)
|
第一种方式是把一个NSNotification作为参数并且post,第二种方式是传入NSNotification的名字和sender,方法创建一个NSNotification并且post,相当于把第一步和第三部融合在一起.这两个方法都是NSNotificationCenter的成员方法.
移除观察者
1
| func removeObserver(_ observer: AnyObject)
|
参数 |
描述 |
Observer |
指定需要移除的观察者,不能为空. |
移除通知
1 2 3
| func removeObserver(_ observer: AnyObject, name aName: String?, object anObject: AnyObject?)
|
这里可以通过name和sender指定移除哪个通知.