消息:NSNotification

31 8月

IOS里类与类间通信有很多方式,例如:delegate(一对一的通信方式,有返回值,双方可以协同处理业务逻辑),KVO(一对多,无返回值,单向无法协同)。

KVO有局限性,只能监听对象的属性,但对业务逻辑来说,不一定都能反映到一个property的变化上,例如系统前后台切换,不用非要设个property来标记当前是前台还是后台,只需要告诉RD系统已经进入前台或后台了。即只需要一个事件,不用实际值的变化,所以有了NSNotification。

NSNotification和KVO一样是一对多,无返回值,单向无法协同,但不需要实际监听对象属性。主要关注系统级事件(例如前后台切换,内存告警等),而不是对象的特有的事件。

对象通过addObserver向消息中心注册想监听的事件。事件发送者通过postNotification向消息中心发送事件,消息中心会广播这条消息,所有注册过监听该消息的对象都能收到。

// 接收播放完成 Notification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_handlePlayEnd) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];

- (void)_handlePlayEnd {
    ...
}

// 对象销毁时也要注销事件
[[NSNotificationCenter defaultCenter] removeObserver:self];

发表评论

电子邮件地址不会被公开。 必填项已用*标注