KVO
- 全称: Key Value Observing(键值监听)
- 作用: 监听模型的属性改变
//为对象p添加一个监听者 //Observer: 监听者 //KeyPath: 属性名(需要监听哪个属性) //options: 监听的哪些选项 [p addObserver:self forKeyPath:@"name" options:kNilOptions context:@"test"];
- 当利用KVO监听到某个对象的属性值发生了改变,就会自动调用这个方法
keyPath: 哪个属性被改了 object: 哪个对象的属性被改了 change: 改成什么样子 context: 当初addObserver时的context参数值
- 步骤
- 添加监听器[对象 addObserver: ...]
- 在添加监听器的后面,写让被监听的属性发生改变的语句
- 移除监听者
- 实现observerValueForKeyPath
- 在上面的方法中可以获取最新的和最旧的值,还有监听的时候传过来的值
- 能拿到改变的是哪个对象的哪个属性
KVC
- 全称: Key Value Coding(键值编码)
1. 赋值
- setValue:forKey:
- setValue:forKeyPath:
- 使用场合
- 给模型的简单属性赋值,forKey与forKeyPath没有区别
- 给模型的复杂属性赋值,forKey与forKeyPath有区别
- path是由Key组成的路径
Person *p = [[Person alloc] init]; Dog *dog = [[Dog alloc] init]; [p setValue:@"wangcai" forKeyPath:@"dog.name"];//正确 [p setValue:@"wangcai" forKey:@"dog.name"];//错误 + forKeyPath可以用来修改模型对象的私有成员变量 [p setValue:@"test" forKeyPath:@"_name"];//正确,直接修改成员变量
- setValuesForKaysWithDictionary
- 问题
- 字典转模型时,用setValue:forKey:只适用于简单的模型,如果是字典中包含模型,则会报错
- 数组中包含多个字典对象
- 问题
2. 取值
- valueForKey
- valueForKeyPath
- dictionaryWithValuesForKeys(模型转字典)
- 如果valueForKeyPath:方法的调用者是数组,那么就是去访问数组元素的属性值
HMJBook *book1 = [[HMJBook alloc] init]; book1.name = @"1"; book1.price = 12; HMJBook *book2 = [[HMJBook alloc] init]; book2.name = @"2"; book2.price = 15; HMJBook *book3 = [[HMJBook alloc] init]; book3.name = @"3"; book3.price = 22; NSArray *books = @{book1, book2, book3}; //取得books数组中所有HMJBook对象的name属性值,放在一份新的数组中返回 NSArray *names = [books valueForKeyPath:@"name"]; //等同于 NSArray *names = [p.books valueForKeyPath:@"name"]; //等同于 NSArray *names = [p valueForKeyPath:@"books.name"]; //计数 NSLog(@"%@", [p.books valueForKeyPath:@"@count"]); //计数 NSLog(@"%@", [p valueForKeyPath:@"books.@count"]); //最大价格 NSLog(@"%@", [p.books valueForKeyPath:@"@max.price"]); //平均值 NSLog(@"%@", [p.books valueForKeyPath:@"@avg.price"]); //平均值 NSLog(@"%@", [p valueForKeyPath:@"books.@avg.price"]);