KVC和KVO的应用

KVC

利用KVC进行简单赋值

/*
forKey和forKeyPath
1>forKeyPath 包含了所有 forKey 的功能
2>forKeyPath 进行内部的点语法,层层访问内部的属性
3>注意: key值一定要在属性中找到
*/
[person setValue:@"王五" forKey:@"name"];
[person.dog setValue:@"阿黄" forKey:@"name"];
[person setValue:@"旺财" forKeyPath:@"dog.name"];

利用KVC修改类的私有成员变量(UIPageControl)

XMGPerson *person = [[XMGPerson alloc] init];
// 假设_age是person的私有成员变量,那么不能使用person->_age赋值
// 但可以利用KVC修改类的私有成员变量
[person setValue:@"88" forKeyPath:@"_age"]; // age _age

利用KVC将字典转模型

/**
 开发中是不建议使用setValuesForKeysWithDictionary:
 1> 字典中的key必须在模型的属性中找到
 2> 如果模型中带有模型,setValuesForKeysWithDictionary不好使
 应用场景: 简单的字典转模型 ---> 框架 (MJExtention)
 */
NSDictionary *dict = @{
                     @"name" :@"lurry",
                     @"money" : @189.88,
                     @"dog" : @{
                             @"name" : @"wangcai",
                             @"price" : @8
                             },
                     @"books": @[
                             @{@"name" :@"iOS快速开发", @"price" : @1999},
                             @{@"name" :@"iOS快速发", @"price" : @199},
                             @{@"name" :@"iOS快开发", @"price" : @99}
                             ]
                     };
[person setValuesForKeysWithDictionary:dict];

利用kvc取值

XMGPerson *person = [[XMGPerson alloc] init];
person.name = @"张三";
person.money = 12332;

// 利用kvc取值
[person valueForKey:@"money"];

返回一个数组对象中所有指定的属性的值
[persons valueForKeyPath:@"name"]

把模型转成字典

XMGPerson *person = [[XMGPerson alloc] init];
person.name = @"lurry";
person.money = 21.21;

NSDictionary *dict = [person dictionaryWithValuesForKeys:@[@"name", @"money"]];

取出数组中所有模型的某个属性值

XMGPerson *person1 = [[XMGPerson alloc] init];
person1.name = @"zhangsan";
person1.money = 12.99;

XMGPerson *person2 = [[XMGPerson alloc] init];
person2.name = @"zhangsi";
person2.money = 22.99;

XMGPerson *person3 = [[XMGPerson alloc] init];
person3.name = @"wangwu";
person3.money = 122.99;

NSArray *allPersons = @[person1, person2, person3];
NSArray *allPersonName = [allPersons valueForKeyPath:@"name"];

NSLog(@"%@", allPersonName);

KVO

给对象绑定一个监听器(观察者)

XMGPerson *person = [[XMGPerson alloc] init];
person.name = @"zs";

/*
 - Observer 观察者
 - KeyPath 要监听的属性
 - options 选项(方法方法中拿到属性值)
     NSKeyValueObservingOptionNew 监听值改变之后,
     NSKeyValueObservingOptionOld 监听值改变之前,
 */
[person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

person.name = @"ls";
person.name = @"ww";

当监听的属性值发生改变

/**
 *  @param keyPath 要改变的属性
 *  @param object  要改变的属性所属的对象
 *  @param change  改变的内容
 *  @param context 上下文
 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    NSLog(@"%@------%@------%@", keyPath, object, change);
}

移除监听

[person removeObserver:self forKeyPath:@"name"];

results matching ""

    No results matching ""