在通知机制中,对某个通知感兴趣的所有对象都可以成为观察者。首先,这些对象要向通知中心(NSNotificationCenter)发出addObserver: selector: name: object进行消息注册,在通知中心接到通知以后,会把通知广播给所有注册过的接受者。投送对象和接受者是一对多的关系。接受者如果对通知不在关注,会给通知者发送removeObserver: name: Object:消息解除注册。
//系统定义的通知类型 UIApplicationDidChangeStatusBarOrientationNotification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rotateScreen) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
//自定义的通知类型APPTerminate 当
applicationDidEnterBackground 方法执行的时候,发送通知给所有注册APPTerminate通知的接受者
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[NSNotificationCenter defaultCenter]postNotificationName:@"APPTerminate" object:self];
}
//接受到通知后,执行doSomething方法
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(doSomething:) name:@"APPTerminate" object:nil];
KVO(Key-Value-Observing)机制
原理图:
该机制下观察者的注册是在被观察者的内部进行的,观察者只需要实现一个和被观察者一样的协议:NSKeyValueObserving,与Notification相反(由观察者自己注册),被观察者通过addObserver: forKeyPath: options: context方法进行注册观察者,以及要被观察的属性。
被观察者,在内部注册观察者 TestViewController 状态和观察者的变量必须声明为类对象
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.vc = [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];
[self addObserver:self.vc forKeyPath:@"state" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:@"pass content"];
self.state = @"launch";
return YES;
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
self.state = @"back ground";
}
观察者,只要实现协议就可
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
NSLog(@"state change %@",change);
}
注意:被观察者中注册的forkeypath的值,就是观察的那个key!,它变化,才给观察者发送通知;