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];