iOS KVC和KVO

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);

}

你可能感兴趣的:(iOS KVC和KVO)