IOS 观察者模式
一个对象状态改变,通知正在对他进行观察的对象,这些对象根据各自要求进行改变;

在cocoatouch框架中,NSNotification机制和KVO使用了观察者模式
通知(notification)机制
原理图

在通知机制中,对某个通知感兴趣的所有对象都可以成为观察者。首先,这些对象要向通知中心(NSNotificationCenter)发出addObserver: selector: name: object进行消息注册,在通知中心接到通知以后,会把通知广播给所有注册过的接受者。投送对象和接受者是一对多的关系。接受者如果对通知不在关注,会给通知者发送removeObserver: name: Object:消息解除注册。
1 2 //系统定义的通知类型 UIApplicationDidChangeStatusBarOrientationNotification 3 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rotateScreen) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; 4 5 //自定义的通知类型APPTerminate 当 applicationDidEnterBackground 方法执行的时候,发送通知给所有注册APPTerminate通知的接受者 6 - (void)applicationDidEnterBackground:(UIApplication *)application { 7 [[NSNotificationCenter defaultCenter]postNotificationName:@"APPTerminate" object:self]; 8 } 9 //接受到通知后,执行doSomething方法 10 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(doSomething:) name:@"APPTerminate" object:nil]; 11
KVO(Key-Value-Observing)机制
原理图:

该机制下观察者的注册是在被观察者的内部进行的,观察者只需要实现一个和被观察者一样的协议:NSKeyValueObserving,与Notification相反(由观察者自己注册),被观察者通过addObserver: forKeyPath: options: context方法进行注册观察者,以及要被观察的属性。
1 //被观察者,在内部注册观察者 TestViewController 状态和观察者的变量必须声明为类对象 2 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 3 self.vc = [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil]; 4 [self addObserver:self.vc forKeyPath:@"state" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:@"pass content"]; 5 self.state = @"launch"; 6 return YES; 7 } 8 - (void)applicationDidEnterBackground:(UIApplication *)application { 9 self.state = @"back ground"; 10 } 11 12 //观察者,只要实现协议就可 13 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 14 NSLog(@"state change %@",change); 15 }
注意:被观察者中注册的forkeypath的值,就是观察的那个key!,它变化,才给观察者发送通知;
浙公网安备 33010602011771号