KVC和KVO

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

 

posted on 2015-08-25 21:08  MJ_Angel  阅读(278)  评论(0编辑  收藏  举报

导航