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,一定记住要销毁!
  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/cwhking/p/4145208.html
Copyright © 2011-2022 走看看