zoukankan      html  css  js  c++  java
  • KVO

    一.概念

    KVO(Key-Value Observing),键值观察。它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

    二.使用步骤

    第一步,添加键值观察。要观察谁,就由谁调用。

    //新建一个Person类
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) int age;
    @end
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.person = [[Person alloc] init];
        
        // 添加键值观察
        /**
         1. 调用对象:要监听的对象
         2. 参数
         1> 观察者,负责处理监听事件的对象
         2> 观察的属性
         3> 观察的选项
         4> 上下文
         */
        [self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"Person Name"];
    }

    第二步,实现监听方法,当点击屏幕的时候,会调用该监听方法

    // NSObject 分类方法,意味着所有的 NSObject 都可以实现这个方法!
    // 跟协议的方法很像,分类方法又可以称为“隐式代理”!不提倡用,但是要知道概念!
    // 所有的 kvo 监听到事件,都会调用此方法
    /**
     1. 观察的属性
     2. 观察的对象
     3. change 属性变化字典(新/旧)
     4. 上下文,与监听的时候传递的一致
     
     可以利用上下文区分不同的监听!
     */
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    
        NSLog(@"睡会 %@", [NSThread currentThread]);
        
        [NSThread sleepForTimeInterval:1.0];
        
        NSLog(@"%@ %@ %@ %@", keyPath, object, change, context);
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
        for (int i = 0; i < 5; ++i) {
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                NSLog(@"%@", [NSThread currentThread]);
                self.person.name = [NSString stringWithFormat:@"zhangsan - %05d", arc4random_uniform(100000)];
            });
        }
        
        NSLog(@"come here");
    }

    第三步,如果不使用 kvo,一定记住要销毁!

    - (void)dealloc {
        [self.person removeObserver:self forKeyPath:@"name"];
    }

    三.小结

    • KVO是同步的,目的是为了保证属性发生变化时,观察者能够及时作出响应!
    • 所有的监听方法执行会在属性变化所在的线程上执行!如果多个线程同时修改一个属性,有可能会出现资源抢夺的问题。一定要让代码简单!监听最重要的属性! 如果监听的属性非常多,KVO的观察方法将非常难写!
    • 如果不使用 kvo,一定记住要销毁!
  • 相关阅读:
    setjmp()和longjmp()函数
    C语言过程活动记录
    【剑指Offer】字符串的排列
    python剑指offer系列二叉树中和为某一值的路径
    二叉搜索树的后续遍历
    如何设置学习率
    各种机器学习算法的优缺点(未完成)
    机器学习中梯度下降法和牛顿法的比较
    特征图大小的计算
    为什么L1稀疏,L2平滑?
  • 原文地址:https://www.cnblogs.com/cwhking/p/4145208.html
Copyright © 2011-2022 走看看