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 

  • 相关阅读:
    【数据结构——二叉树】判断二叉树是否为完全二叉树
    【数据结构 ——二叉树】判断二叉树(不限于完全二叉树)一个结点的层数
    【JavaScript】JS知识点总结
    【JavaScript】BOM对象——Window对象&History对象&Location 对象
    【JavaScript】内部与外部引入方式
    【JavaScript】案例三:使用JS完成页面定时弹出广告——事件(onload)
    re模块
    模块
    面向对象--内置方法
    __repr__浅析
  • 原文地址:https://www.cnblogs.com/lumouren009/p/4150124.html
Copyright © 2011-2022 走看看