观察者模式之通知机制与KVO机制

来源:互联网 发布:java验证码代码怎么写 编辑:程序博客网 时间:2024/05/16 05:29

观察者模式也叫发布/订阅模式,顾名思义,主要由一个观察者(observe)和一个订阅者(subscribe)组成。

  • observe用于检查状态,发出通知。
  • subscribe用于接受observe发出的通知,然后响应。
  • 最常见于应用在MVC模式中。
例如:作战时,哨兵(observe)会在营地上巡逻放哨,此时我方战士(subscribe)在休息,一旦哨兵发现有敌军入侵,则发送通知(notifiction),我方战士接受到notification则马上停止休息,进入作战准备状态。

cocoa touch框架中,观察者模式的具体应用有两个----广播通知KVO机制
  • 广播通知
  常用的类:NSNotificationCenter
      常用的方法:defaultCenter ( 获取通知中心 )
    addObserver : selector : name : object  ( 消息注册 )
                           removeObserver : name:object :(解除注册消息)
                           postNotification : postNotificationName : object : userInfo : ( 发送通知 )
代码: 
#pragma 广播通知- (IBAction)observeBtn:(id)sender {//    注册通知,广播通知会将通知YANRegisterNotification与动作regisiterAction联系起来,当发出YANRegisterNotification时则响应regisiterAction    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(regisiterAction:) name:@"YANRegisiterNotification" object:nil] ;}-(void)regisiterAction:(NSNotification *)notification{    NSDictionary *data = [notification userInfo] ;\    NSString *result = [data objectForKey:@"username"] ;    self.textField.text = result ;}- (IBAction)notificationAction:(id)sender {     // 发送YANReigisterNotification通知,并且传递data数据         NSDictionary *data = [NSDictionary dictionaryWithObject:self.sendNotification.text forKey:@"username"] ;    [[NSNotificationCenter defaultCenter]postNotificationName:@"YANRegisiterNotification" object:nil userInfo:data] ;}
          
  • KVO机制:KVO其实就是一个协议<NSKeyValueObserving>,而且NSObject已经实现该协议。所以我们可以在代码上直接实现其方法就可以
常用到的方法:
//开始观察对象 
addObserver:(NSObject *)监听的对象   forKeyPath:(NSString *)状态属性   options:(NSKeyValueObservingOptions)   context:(void *)
//状态改变时响应动作
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
代码:
# pragma   KVO机制/** *   观察者开始观察对象textfield,观察的状态是states。 */- (IBAction)startKVO:(id)sender {    self.states = @"yans67" ;    [ self addObserver:self forKeyPath:@"states" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"context"];//监听的对象是当前对象,所以用self}-(void)textFieldDidBeginEditing:(UITextField *)textField{    self.states = @"begin edit" ;}-(void)textFieldDidEndEditing:(UITextField *)textField{    self.states = @"end edit" ;}-(BOOL)textFieldShouldReturn:(UITextField *)textField{    [textField endEditing:YES] ;    self.states = @"return edit" ;    return true ;}/** *  状态改变时响应的动作 */-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    NSString *result = (NSString *)change[NSKeyValueChangeNewKey] ;    self.KVOresultlabel.text = result ;}

     



总结: 无论是KVO机制还是广播通知机制,都降低了代码间的耦合度(从本例子中很难看出来,为了方便本例都是些在同一个类里面,但如果写在两个不同的类就能很明显的体现出来)而且能实现参数的传递,实现类与类之间方法的调用。

0 0
原创粉丝点击