zoukankan      html  css  js  c++  java
  • 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"]);

     

  • 相关阅读:
    微信开放平台(公众号第三方平台) -- 全网发布
    SQL 邮件配置篇
    让BI告诉你:圣诞老人去哪了?
    锁定和行版本控制
    数据库质疑修复总结(转)
    抢救损坏数据库中的数据
    将 PAGE_VERIFY 数据库选项设置为 CHECKSUM
    replicate复制函数
    @@IDENTITY与SCOPE_IDENTITY()
    RESTORE DATABASE的standby选项
  • 原文地址:https://www.cnblogs.com/HMJ-29/p/4758674.html
Copyright © 2011-2022 走看看