OC_NSNotificationCenter

226 阅读2分钟

NSNotificationCenter的介绍

NSNotificationCenter实际是在程序内部提供了一种广播机制。把接收到的消息,根据内部的消息转发表,将消息转发给需要的对象。NSNotificationCenter 较之于 Delegate 可以实现更大的跨度的通信机制,可以为两个无引用关系的两个对象进行通信。

NSNotificationCenter 的通信原理使用了观察者模式,以下是广播的运行机制

  1. 接收者向NSNotificationCenter 注册观察者,并提供观察的事件(以字符串命名),及该事件触发时该执行的 SelectorBlock
  2. 发起人向NSNotificationCenter 激发事件
  3. 接收者收到广播,执行相应的 SelectorBlock

NSNotificationCenter的使用

注册广播

注册广播需要使用的方法是

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;

这个方法需要使用一个NSNotificationCenter对象来调用,其中所需要的参数分别是观察的对象,收到广播后要执行的方法,事件的名称以及传递的参数。

首先我们需要创建一个广播中心对象调用这个方法,这个对象可以是匿名对象。

// 匿名的广播中心对象
[NSNotificationCenter defaultCenter];

然后我们使用这个匿名对象来注册广播,并且实现被调用的方法

[[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(test) name:@"TEST" object:nil];
-(void)test{
    NSLog(@"有新的课程上线!");
}

这样就完成了广播的注册。

激发广播

接着我们可以在某一时刻激发这个广播,使用的方法是:

- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject;

同样我们需要用一个广播中心对象来调用这个分方法,需要的参数是对应的事件名称和参数,我们可以同样适用一个广播中心的匿名对象来调用:

[[NSNotificationCenter defaultCenter]postNotificationName:@"TEST" object:nil];

调用这个方法后广播中心就会发出一个广播从而让接受者调用预先设置的方法。

移除广播

我们需要在接受者对象的 dealloc 方法中移除这个广播。

使用的方法是

- (void)removeObserver:(id)observer name:(nullable NSNotificationName)aName object:(nullable id)anObject;

我们同样使用一个匿名方法来调用它,设置的参数必须和注册时的相同:

-(void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"TEST" object:nil];
}