通知机制是由观察者模式实现的。
什么是观察者模式?
观察者模式就是一个对象依附于它的观察者,当这个对象本身的属性发生改变时主动发出通知。
优点:观察者模式将对象和观察者完美的分离开,式在模块之间划定了清晰的界限,所以对象和观察者之间并没有直接联系,互不认识。
既然说到了观察者模式,就顺便提下KVO,KVO也是用观察者模式实现,当对象发生改变的时候,观察者就会觉察到这个消息,并作出相应的反应。有一点像按钮的点击方法,点击后触发某个时间。
但是KVO和通知机制不同的是:对象为所有的观察者提供变更通知,通知机制有一个通知中心,这个通知中心负责把所有通知告诉观察者
上下文通知
如果被观察属性是一个NSManagedOjbect的声明属性,就可以监听 NSManagedObjectContextObjectsDidChangeNotification。这仍然使用NSNotification方式 不过有点不同,因为NSManagedObject不会手动发送通知。
这种方法的注册如下
[[NSNotificationCenter defaultCenter] addObserver:listenerObejct selector:@selector(receivingMethodOnListener:) name:NSManagedObjectContextObjectsDidChangeNotification object:observedManagedObjectContext];
在receivingMethodOnListener:中,通知的userinfo中NSInsertedObjectsKey、NSUpdatedObjectsKey和NSDeletedObjectsKey等键值会给出受影响的对象集合。
优点: 是在整个NSManagedObjectContext中跟踪变化的最简单的方式。
缺点: 仅适用于Core Data并不能提供影响对象之外的具体信息。
用于观察的委托
最后一个Cocoa简化的观察者模式是委托。广义上说委托可以不仅仅处理简单的观察,但不一定需要做更多。
比如,NSApplication和NSWindow所有的通知都会同时传给委托并由其处理。有些类会传给它们的委托类似通知的消息,而不同时发送通知。比如NSMenu,发送menuWillOpen:给其委托但不会发送相应的NSNotification。
为了连接一个委托,只需在支持委托的对象上调用如下代码:
[object setDelegate:delegateObject];
对象可以收到任何它想要的委托消息。
优点: 支持它的类有详尽和具体信息。
缺点: 该类必须支持委托。某一时间只能有一个委托连接到某一对象。