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 

  • 相关阅读:
    基于蓝牙的安卓客户端开发
    在word文档中添加上角标和下角标
    vs2008打开类视图,看不到类的解决方法
    容器vector 迭代器iterator 应用
    next_permutation()
    pair运用
    vector学习
    容器之vector
    指针 * &
    派生类中的构造函数和析构函数
  • 原文地址:https://www.cnblogs.com/lumouren009/p/4150124.html
Copyright © 2011-2022 走看看