通知这种模式可以很方便的在类与类中进行相互间的交互和传值。
那么什么时刻使用通知比较合适呢?
当你需要将改变通知所有的对象时,而你又不知道这些对象的具体类型,此时就可以使用观察者模式。 改变发生在同一个对象中,并在别的地方需要将相关的状态进行更新
通知的应用:
第一步,在通知中心注册一条通知。
a.第一种注册的方法。
[[NSNotificationCenterdefaultCenter] addObserver:self
selector:@selector(notificationChange:)
name:@"kNotificationKey"
object: nil ];
注:NSNotificationCenter 就是通知中心,它获取通知对象,注册并使用通知。
上述代码注册了一条通知。
addObserver是接收通知的对象,通常为self;selector是接收到通知后要执行的操作,可以理解为操作事件;name是通知的名称,一般是一个字符串,注意在这里我们通常将该字符串定义为一个宏或者是一个全局的静态变量,用来防止书写的时候出错;object限定只接收来自哪些对象的通知,通常设为nil。
b.另一种注册通知的方法。
[[NSNotificationCenterdefaultCenter] addObserverForName:@"kNotificationKey"
object: self
queue:nil
usingBlock:^(NSNotification *note) {
NSLog(@"%s",__func__);//测试代码
}];
name:通知的名称 ;obj:通知发布者 ;block:收到对应的通知时,会回调这个block块中的代码;
blockqueue:决定了block在哪个操作队列中执行,如果传nil,默认在当前操作队列中同步执行通知 。
注意:如果一个对象要想接收到通知,必须先在通知中心进行注册。
第二步,在另一个地方就可以发布这个通知了。(需要注意的一点是:在发布这个通知之前必须要成功的注册过这个通知);
发布一个通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"kNotificationKey"object:self ];
注意:这里的postNotificationName的值必须和注册通知的时候的名字是一样的。因为这是一个通知的唯一标识。
第三步,由于在一个应用程序中可以注册的通知数量有限,所以当我们的通知,用完之后要记得及时关闭通知。
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"kNotificationKey" object:nil];
同样要注意的是,这里的name和注册时候的name也是同一个名字,才能成功的关闭这个通知。
下面的这个图片是按照自己的理解做了一张形象图,如果可以理解是最好。不理解也没事,因为每个人将抽象化作具体的方法与理解方式不一样。希望可以有帮助。