kvo深入浅出举例
2024-08-20 00:23:40
一,概述
KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
二,使用方法
系统框架已经支持KVO,所以程序员在使用的时候非常简单。
1. 注册,指定被观察者的属性
2. 实现回调方法 谁是观察者 这个回调方法就写在哪
3. 移除观察 最好在dealloc中写
三,实例:
假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。
添加两个实体类 一个是股票Strock 一个是person
Strock.h
@interface Strock : NSObject
{
NSString *_name;
float _price;
}
{
NSString *_name;
float _price;
}
@end
Strock.m
-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,price:%f",_name,_price];
{
return [NSString stringWithFormat:@"name:%@,price:%f",_name,_price];
}
person.m
//回调方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"keyPath:%@,object:%@,change:%@",keyPath,object,change);
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"keyPath:%@,object:%@,change:%@",keyPath,object,change);
}
viewController.m
self.person = [[Person alloc]init];
self.strock = [[Strock alloc]init];
//给属性赋值
[self.strock setValue:@"baidu" forKey:@"_name"];
[self.strock setValue:@155 forKey:@"_price"];
//设置person为观察者
[self.strock addObserver:self.person forKeyPath:@"_price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
}
//拖进来一个点击 事件 当button点击的时候
- (IBAction)priceClicked:(UIButton *)sender {
NSInteger price = [[self.strock valueForKey:@"_price"]floatValue];
[self.strock setValue:@(price+1) forKey:@"_price"];
}
//移除观察者
-(void)dealloc
{
[self.strock removeObserver:self.person forKeyPath:@"_price" context:nil];
self.strock = [[Strock alloc]init];
//给属性赋值
[self.strock setValue:@"baidu" forKey:@"_name"];
[self.strock setValue:@155 forKey:@"_price"];
//设置person为观察者
[self.strock addObserver:self.person forKeyPath:@"_price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
}
//拖进来一个点击 事件 当button点击的时候
- (IBAction)priceClicked:(UIButton *)sender {
NSInteger price = [[self.strock valueForKey:@"_price"]floatValue];
[self.strock setValue:@(price+1) forKey:@"_price"];
}
//移除观察者
-(void)dealloc
{
[self.strock removeObserver:self.person forKeyPath:@"_price" context:nil];
}
最新文章
- java中易遗忘的知识,不定时更新……
- 给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理
- MyBatis学习总结(七)——Mybatis缓存(转载)
- 本地json文件的编辑器,node-webkit开发的exe程序
- attilax.java 注解的本质and 使用最佳实践(3)O7
- SnapKit代码约束
- 使用mysqlbinlog server远程备份binlog的脚本
- B - Plane of Tanks: Pro
- [Objective-c 基础 - 2.4] 多态
- [置顶] ios 在一定选项范围随机选取选项demo
- thinkphp中的钩子_什么是钩子?
- 面向对象_new,__eq__,__hash__
- codeforces 735C Tennis Championship(贪心+递推)
- 《Linux内核设计与实现》第十八章读书笔记
- Curator之Recipes之锁
- 转:前端js、jQuery实现日期格式化、字符串格式化
- day40 python MySQL【四】 之 【索引】【视图】【触发器】【存储过程】【函数】
- 简单说说SpringMVC
- 2016-2017-2 20155325实验二《Java面向对象程序设计》实验报告
- [iOS微博项目 - 4.0] - 自定义微博cell
热门文章
- 查看linux内存、cpu
- 【响应式Web设计实践 #BOOK#】
- 【转】Linux命令之查看文件占用空间大小-du,df
- [QT]Qt+VS2012+Win8 64Bit安装
- Unity Fresnel Hero(Dota2) Shader
- leetcode https://oj.leetcode.com/problems/jump-game-ii/
- GPG error: the public key is not available
- 关键字 final
- 开源跨平台的3D渲染软件
- Java 内存泄露的理解与解决过程