KVC很多人都知道,那么什么是KVO呢?Key Value Observing,直译为:基于键值的观察者。

主要用于有关视图界面交互编程中,比如,实体(或者叫名词、或者叫域模型),在应用中表示名词的部分,类似Java中的Java Bean。再具体点儿,在下文的示例中。图书(Book类),就是个实体。它的属性有书名(name)和价格(price)。那么,在界面开发中,可能有多个视图和这个实体有关联。如果等实体(Book)的价格(price)发生了变化,这些关联的界面都要被修改。

比较好的做法是使用观察者模式,各个界面都注册观察者,观察图书的价格变化,当变化后改动自己的视图。

ObjC中提供了这个模式的解决方案,就是KVO。以下用简单示例说明KVO的实现方式。

Book类,头文件:

#import <Foundation/Foundation.h>

@interface Book : NSObject {     NSString *name; float price; }

@end

Book类的实现文件,没做任何事情,不贴了。

现在,假设我有个视图,MyView,我这里为了不带入实际视图类的复杂性,只是模拟一个。用普通类。头文件:

#import <Cocoa/Cocoa.h>

@class Book;

@interface MyView : NSObject {     Book *book; }

- (id) init:(Book *)theBook;

@end

实现文件:

#import "MyView.h"

@implementation MyView

- (id) init:(Book *)theBook { if(self=[super init]){         book=theBook;         [book addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];     } return self; }

- (void) dealloc{     [book removeObserver:self forKeyPath:@"price"];     [super dealloc]; }

- (void)observeValueForKeyPath:(NSString *)keyPath                       ofObject:(id)object                         change:(NSDictionary *)change                        context:(void *)context{ if([keyPath isEqual:@"price"]){         NSLog(@">>>>>>>price is changed");         NSLog(@"old price is %@",[change objectForKey:@"old"]);         NSLog(@"new price is %@",[change objectForKey:@"new"]);     } }

@end

这里的init方法中,可以看到向book实例增加了观察者,是针对价格price属性的。这里用的:

options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew

可以让通知携带旧的price值和新的price值。后面会看到。observeValueForKeyPath方法,就是当price属性发生变化后,调用的方法。

main方法中调用的代码:

Book *book4=[[Book alloc] init]; NSArray *bookProperties=[NSArray arrayWithObjects:@"name",@"price",nil]; NSDictionary *bookPropertiesDictionary=[book4 dictionaryWithValuesForKeys:bookProperties]; NSLog(@"book values: %@",bookPropertiesDictionary);

[[[MyView alloc] init:book4] autorelease];

NSDictionary *newBookPropertiesDictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"《Objective C入门》",@"name", @"20.5",@"price",nil]; [book4 setValuesForKeysWithDictionary:newBookPropertiesDictionary]; NSLog(@"book with new values: %@",[book4 dictionaryWithValuesForKeys:bookProperties]);

在这里引发了price属性变化,触发了MyView的处理。

另外,要注意,在Book实例释放前,要删除观察者,否则会报错,这里是在MyView里面实现的:

- (void) dealloc{     [book removeObserver:self forKeyPath:@"price"];     [super dealloc]; }

这里假定MyView实例的生命周期小于等于Book实例。实际使用可能要根据情况在合适的地方addObserver和removeObserver。

ObjC: 使用KVO相关推荐

  1. Module System of Swift (简析 Swift 的模块系统)

    原文地址: http://andelf.github.io/blog/2014/06/19/modules-for-swift/ Swift 中模块是什么?当写下 Swift 中一句 import C ...

  2. [深入浅出Cocoa]详解键值观察(KVO)及其实现机理

    [深入浅出Cocoa]详解键值观察(KVO)及其实现机理 本文转载至    罗朝辉 (http://www.cppblog.com/kesalin/) 本文遵循"署名-非商业用途-保持一致& ...

  3. KVO方式监听数组的变化动态刷新tableView

    写作本文来由:   iOS默认不支持对数组的KVO,因为普通方式监听的对象的地址的变化,而数组地址不变,而是里面的值发生了改变 整个过程需要三个步骤 (与普通监听一致) /* *  第一步 建立观察者 ...

  4. (译)KVO的内部实现

    09年的一篇文章,比较深入地阐述了KVO的内部实现. KVO是实现Cocoa Bindings的基础,它提供了一种方法,当某个属性改变时,相应的objects会被通知到.在其他语言中,这种观察者模式通 ...

  5. iOS KVO (验证Object-C实现流程)

    前言 在Object-C中有一种观察者模式,即是Key-Value-Observing(KVO). 利用KVO可以很容易实现视图组件和数据模型的分离.当数据模型的值改变时,会马上触发视图组件,更新视图 ...

  6. 轻量级KVO ——》 KVO 管理 observeValueForKeyPath

    [转]http://joeyio.com/2013/10/21/lightweight_kvo/ 在这篇文章中,我会实现一个自己用的简单KVO类,我认为KVO非常棒,然而对于我大部分的使用场景来说,有 ...

  7. Ios KVC KVO

    一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度. *"KVO" ...

  8. 从使用 KVO 监听 readonly 属性说起

    01.KVO 原理 KVO 是 key-value observing 的简写,它的原理大致是: 1.当一个 object(对象) 有观察者时候,动态创建这个 object(对象) 的类的子类(以 N ...

  9. Objc Runtime在项目中该怎么用

    2019独角兽企业重金招聘Python工程师标准>>> Objc Runtime在项目中该怎么用 从以下四个方面讲述Objc Runtime在项目中的使用场景,使用的例子来自于git ...

最新文章

  1. Prometheus — 软件架构
  2. 10行代码AC——L1-018 大笨钟 (10分)(~解题报告~)
  3. Linux下Apache自动监测重启脚本
  4. java se/ee_嗨,您好 。 。 ! 您如何评价Java / Java EE技能?
  5. Android 应用更新和在服务器下载android应用
  6. linux 内核定时器精度_linux使用select实现精确定时器详解
  7. apache虚拟主机名不区分大小写的解决办法
  8. 【读书笔记】实战JAVA虚拟机JVM故障诊断与性能优化 读书笔记
  9. 加工中心宏程序生成器_数控加工中心通用铣螺纹宏程序
  10. 使用IPV6 ACL对telnet登陆进行限定
  11. no such file to load -- bundler/setup
  12. jquery_Ajax
  13. HTTP方式文件分片断点下载
  14. (附源码)springboot嘉应房地产公司质量管理系统 毕业设计 453100
  15. java mas,java 移动MAS的DB接口实现彩信发送
  16. JustinMind
  17. 专业技能热门配方大全
  18. ROS AUV 启动
  19. 积极心态,助力人生成功
  20. 【心理咨询师考试笔记】操作技能(四)——心理咨询方法

热门文章

  1. c++ set遍历_Python算法学习之图与图的遍历
  2. 职场求生:老板说,解决不了用户流失,就要解决我,咋办?
  3. 聊一聊,用户画像的前世今生
  4. Google IO 谈 AI First,我们却发现了更多
  5. 使用Opencv构建一个简单的图像相似检测器(MSE、SSIM)
  6. Symfony2中的命名约定
  7. 深度 | 人工智能全局概览:通用智能的当前困境和未来可能
  8. J2EE互联网产品打造
  9. CentOS 6.3下rsync服务器的安装与配置[转]
  10. 在虚拟机中安装Windows Server 2008企业版