KVO:Key Value Observing, 键值监听, KVO提供了一种观察属性改变的机制, 一旦当某个属性改变了, 通过KVO观察到这种改变。
KVC- Key Value Coding 缩写
键值编码
作用: 提供了一种使用字符串作为关键字访问属性的机制
demo:
-(void)testKVO
{
// KVO的基本使用(注意事项)
// 实例: 实现汽车的速度显示器
// 如何实现: 当速度改变之后, 显示器同步显示
// 项目中: 显示下载进度, 知道下载进度的更新
car = [[Car alloc] init];
car.speed = 0; //初始速度
//如何监听属性变化---使用KVO
//参数1: 有谁处理变化 self
//参数2: 监听哪个属性的变化
//参数3: 监听的选项
[car addObserver:self forKeyPath:@"speed" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
//启动汽车
car.speed = 10;
car.speed = 20;
// KVO的原理
// 如果想给car类添加监听, 创建car类的子类, 重写car类setter方法, 一旦setter被调用的时候, 执行KVO对应的事件处理方法
// kvo只有在通过setter修改属性的才有有效的
}
-(void)dealloc
{
//KVO监听结束之后必须移除监听, 否则会造成内存问题
[car removeObserver:self forKeyPath:@”speed”];
}
-(void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary )change context:(void *)context
{
NSLog(@”当前的速度是 %@”,[object valueForKeyPath:keyPath]);
}
-(void)testKVC
{
// 1.2 实例 Car类
//使用Car第一种方式
car = [[Car alloc] init];
car.type = @"BMW";
car.speed = 200.0;
NSLog(@"type = %@, speed=%f",car.type,car.speed);
//使用KVC访问
[car setValue:@"Benz" forKey:@"typec"];
NSLog(@"type = %@, speed=%f",car.type,car.speed);
//KVC最常用 把字典中得数据转化为model
NSDictionary *dict = @{@"type":@"QQ",@"speed":@150};
Car *newCar = [[Car alloc] init];
for (NSString *key in dict) {
//KVC的使用
[newCar setValue:dict[key] forKey:key];
}
NSLog(@"new car type = %@",newCar.type);
//最常用的
//作用: 把字典中每个键值对的数据赋值给对象中对应的属性
[newCar setValuesForKeysWithDictionary:dict];
//keyPath的使用
// 遇到的情况: KVC操作的对象是多层的
Engine *engine = [[Engine alloc] init];
engine.power = 10;
car.engine = engine;
//需求: 利用kvc把car对象的engine对象的power设置为20
//解决: 使用KeyPath
[car setValue:@20 forKeyPath:@"engine.power"];
//获取power
NSNumber *num = [car valueForKeyPath:@"engine.power"];
NSLog(@"power = %f",num.doubleValue);
}