ObjC: 使用KVO
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相关推荐
- Module System of Swift (简析 Swift 的模块系统)
原文地址: http://andelf.github.io/blog/2014/06/19/modules-for-swift/ Swift 中模块是什么?当写下 Swift 中一句 import C ...
- [深入浅出Cocoa]详解键值观察(KVO)及其实现机理
[深入浅出Cocoa]详解键值观察(KVO)及其实现机理 本文转载至 罗朝辉 (http://www.cppblog.com/kesalin/) 本文遵循"署名-非商业用途-保持一致& ...
- KVO方式监听数组的变化动态刷新tableView
写作本文来由: iOS默认不支持对数组的KVO,因为普通方式监听的对象的地址的变化,而数组地址不变,而是里面的值发生了改变 整个过程需要三个步骤 (与普通监听一致) /* * 第一步 建立观察者 ...
- (译)KVO的内部实现
09年的一篇文章,比较深入地阐述了KVO的内部实现. KVO是实现Cocoa Bindings的基础,它提供了一种方法,当某个属性改变时,相应的objects会被通知到.在其他语言中,这种观察者模式通 ...
- iOS KVO (验证Object-C实现流程)
前言 在Object-C中有一种观察者模式,即是Key-Value-Observing(KVO). 利用KVO可以很容易实现视图组件和数据模型的分离.当数据模型的值改变时,会马上触发视图组件,更新视图 ...
- 轻量级KVO ——》 KVO 管理 observeValueForKeyPath
[转]http://joeyio.com/2013/10/21/lightweight_kvo/ 在这篇文章中,我会实现一个自己用的简单KVO类,我认为KVO非常棒,然而对于我大部分的使用场景来说,有 ...
- Ios KVC KVO
一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度. *"KVO" ...
- 从使用 KVO 监听 readonly 属性说起
01.KVO 原理 KVO 是 key-value observing 的简写,它的原理大致是: 1.当一个 object(对象) 有观察者时候,动态创建这个 object(对象) 的类的子类(以 N ...
- Objc Runtime在项目中该怎么用
2019独角兽企业重金招聘Python工程师标准>>> Objc Runtime在项目中该怎么用 从以下四个方面讲述Objc Runtime在项目中的使用场景,使用的例子来自于git ...
最新文章
- Prometheus — 软件架构
- 10行代码AC——L1-018 大笨钟 (10分)(~解题报告~)
- Linux下Apache自动监测重启脚本
- java se/ee_嗨,您好 。 。 ! 您如何评价Java / Java EE技能?
- Android 应用更新和在服务器下载android应用
- linux 内核定时器精度_linux使用select实现精确定时器详解
- apache虚拟主机名不区分大小写的解决办法
- 【读书笔记】实战JAVA虚拟机JVM故障诊断与性能优化 读书笔记
- 加工中心宏程序生成器_数控加工中心通用铣螺纹宏程序
- 使用IPV6 ACL对telnet登陆进行限定
- no such file to load -- bundler/setup
- jquery_Ajax
- HTTP方式文件分片断点下载
- (附源码)springboot嘉应房地产公司质量管理系统 毕业设计 453100
- java mas,java 移动MAS的DB接口实现彩信发送
- JustinMind
- 专业技能热门配方大全
- ROS AUV 启动
- 积极心态,助力人生成功
- 【心理咨询师考试笔记】操作技能(四)——心理咨询方法