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!,它变化,才给观察者发送通知;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

posted on 2015-01-23 11:21  bakenG  阅读(180)  评论(0)    收藏  举报