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

时间: 2024-10-13 00:48:39

KVO初探的相关文章

Swift之旅:2.完成计算器,初探MVC设计模式

斯坦福大学公开课:iOS8 网易空开课地址链接:斯坦福大学公开课:IOS8开发 github上字幕链接:字幕 百度网盘资源下载链接:百度网盘 1.计算器完成 ①回车键及相关的代码 //定义一个数组,用来当做栈保存数据使用 var openStack = Array<Double>(); //enter用来执行进栈操作 @IBAction func enter() { //设置重新开始输入字符串 userIsInTheMiddleOfTypingANumber = false //将value进

初探swift语言的学习笔记八(保留了许多OC的实现)

尽管swift作为一门新语言,但还保留了许多OC的机制,使得swift和OC更好的融合在一起.如果没有OC基础的先GOOGLE一下. 如:KVO,DELEGATE,NOTIFICATION. 详见DEMO. import Foundation @objc // 需要打开objc标识,否则@optional编译出错 protocol kvoDemoDelegate { func willDoSomething() @optional func didDoSomething() //可选实现, }

iOS------通知、代理、kvo 详解

通知:通知中心实际上是在程序内部提供了消息广播的一种机制.通知中心不能在进程间进行通信.实际上就是一个二传手,把接收到的消息,根据内部的一个消息转发表,来将消息转发给需要的对象.通知中心是基于观察者模式的,它允许注册.删除观察者. 一个 NSNotificationCenter 可以有许多的通知消息 NSNotification, 对于每一个 NSNotification 可以有很多的观察者 Observer 来接收通知. 委托代理:委托代理(degegate),顾名思义,把某个对象要做的事情委

进阶之初探nodeJS

一.前言 在"初探nodeJS"随笔中,我们对于node有了一个大致地了解,并在最后也通过一个示例,了解了如何快速地开启一个简单的服务器. 今儿,再次看了该篇随笔,发现该随笔理论知识稍多,适合初级入门node,固萌生一个想法--想在该篇随笔中,通过一步步编写一个稍大一点的node示例,让我们在整体上更加全面地了解node. so,该篇随笔是建立在"初探nodeJS"之上的,固取名为"进阶之初探nodeJS". 好了,侃了这多,那么我们即将实现一个

从273二手车的M站点初探js模块化编程

前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数据. 273这个M站点是产品推荐我看的.第一眼看这个产品时我就再想他们这个三次加载和翻页按钮的方式,那么小分页的pageIndex是怎么计算的.所以就顺便看了下源码. 提到看源码时用到了Chrome浏览器的格式化工具(还是朋友推荐我的,不过这个格式化按钮的确不明显,不会的话自行百度). 三次加载和分

[转载]HDFS初探之旅

转载自 http://www.cnblogs.com/xia520pi/archive/2012/05/28/2520813.html , 感谢虾皮工作室这一系列精彩的文章. Hadoop集群(第8期)_HDFS初探之旅 1.HDFS简介 HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上.它所具有的高容错.高可靠性.高可扩展性.高

0124——KVC KVO模式

1.KVC KVC是Key-Value-Coding的简称,它是一种可以直接通过字符串的名 字(key)来访问类属性(实例变量)的机制.而不是通过调用Setter.Getter方法访问.当使用KVO.Core Data.CocoaBindings.AppleScript(Mac支持)时,KVC是关键技术.  Person * xw = [[Person alloc]init]; Dog *dg = [[Dog alloc]init]; //使用kvc设置成员变量的值 //使用之前必须得知道变量的

UI_18 图片异步下载、KVO

一.异步下载图片ImageViewDownloader 图?下载是iOS开发中常?的功能,但系统并未提供图?下载类. 为了便于后续使?,可以将图?下载封装到?个类?? (ImageDownloader) 新建SingleViewApplication,使用默认的Storyboard,向其中添加一个Button一个ImageView并关联属性.添加事件.点击Button实现异步下载并显示图片.AsynImageDownloader类封装了下载图片的方法. 使用代理进行AsynImageDownlo

iOS开发——实用篇&amp;KVO与KVC详解

KVO与KVC详解 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听(KVO)特性: 键值编码KVC 键值监听KVO 键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象.其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Valu