Farlanki

NSNotification

字数统计: 516阅读时长: 1 min
2016/02/24 Share

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指定移除哪个通知.

CATALOG
  1. 1. NSNotification和KVO的区别
  2. 2. NSNotificationCenter
  3. 3. 使用NSNotification
    1. 3.1. 创建一个通知对象
    2. 3.2. 注册通知
    3. 3.3. 发送通知
    4. 3.4. 移除观察者
    5. 3.5. 移除通知