zoukankan      html  css  js  c++  java
  • KVO初探

    KVO全称为key-value oberserving, 源于观察者模式,即key对应的value改变,observer要做出反应。类似Model对Controller发出通知Notification. Notification通常用于响应系统的一些变化,例如键盘出现、消失等。

    在数据模型中,将myController设置为观察者,keyPath为myModel的属性,options通常为NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld, context为任意data, 用于传入observeValueForKeyPath:ofObject:change:context:

    [myModel addObserver:(NSObject *)myController forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context]

    在myController中,实现observeValueForKeyPath:ofObject:change:context:方法来相应value的变化。

    //
    //  ViewController.m
    //  KvoTest
    //
    //  Created by luzheng1208 on 14/12/7.
    //  Copyright (c) 2014年 luzheng. All rights reserved.
    //
    
    #import "ViewController.h"
    
    @interface ViewController () {
        
    }
    
    @property (strong, nonatomic) NSString *name;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.name = @"Xiao Ming";
        [self registerForKVO];
        
        //[self willChangeValueForKey:@"name"];
        self.name = @"Xiao Hong";
        self.name = @"Xiao Li";
        //[self didChangeValueForKey:@"name"];
    }
    
    - (void)dealloc {
        [self unregisterForKVO];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    
    
    #pragma mark - KVO
    
    - (void)registerForKVO {
        [self addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];
    }
    
    - (void)unregisterForKVO {
        [self removeObserver:self forKeyPath:@"name"];
    }
    
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        if ([keyPath isEqualToString:@"name"]) {
            NSLog(@"The old value is %@", [change objectForKey:NSKeyValueChangeOldKey]);
            NSLog(@"The new value is %@", [change objectForKey:NSKeyValueChangeNewKey]);
        }
        else
        {
            [super observeValueForKeyPath:keyPath
                                 ofObject:object
                                   change:change
                                  context:context];
        }
    }
    
    
    @end
    

     其输出为:

    2014-12-07 23:02:38.951 KvoTest[19553:2584967] The old value is Xiao Ming
    2014-12-07 23:02:38.954 KvoTest[19553:2584967] The new value is Xiao Hong
    2014-12-07 23:02:38.954 KvoTest[19553:2584967] The old value is Xiao Hong
    2014-12-07 23:02:38.954 KvoTest[19553:2584967] The new value is Xiao Li
    

    上面的例子中未引入Model。

    KVO还有手动实现的方法,具体参见blog: http://www.cppblog.com/kesalin/archive/2012/11/17/kvo.html 

  • 相关阅读:
    深入解析Hibernate核心接口
    Hibernate基本原理
    深入hibernate的三种状态
    Hibernate commit() 和flush() 的区别
    Hibernate中的merge使用详情解说
    Record is locked by another user
    Vue路由router-link的使用
    Vue-router的基本使用
    Vue把父组件的方法传递给子组件调用(评论列表例子)
    Vue中子组件调用父组件的方法
  • 原文地址:https://www.cnblogs.com/lumouren009/p/4150124.html
Copyright © 2011-2022 走看看