首页 > 代码库 > IOS 观察者模式

IOS 观察者模式

一个对象状态改变,通知正在对他进行观察的对象,这些对象根据各自要求进行改变;
 
                         技术分享
 
在cocoatouch框架中,NSNotification机制和KVO使用了观察者模式
 
通知(notification)机制
原理图
                              技术分享
 
          在通知机制中,对某个通知感兴趣的所有对象都可以成为观察者。首先,这些对象要向通知中心(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!,它变化,才给观察者发送通知;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

IOS 观察者模式