美文网首页
KVO的使用

KVO的使用

作者: Zz橙淞 | 来源:发表于2017-03-21 21:15 被阅读0次

KVO

  • KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。KVO其实也是“观察者”设计模式的一种应用。

kvo的使用

  • 1: 先创建一个nsobject类
    #import <Foundation/Foundation.h>

     @interface kvoCatagory : NSObject
    
     @property(nonatomic,assign)NSInteger kvoNum;
    
     @end
    
    
    #import "kvoCatagory.h"
    
    @implementation kvoCatagory
    
    @synthesize kvoNum;
    
    @end
    
  • 2:实现kvo监听

    #import "ViewController.h"
    #import "kvoCatagory.h"
    @interface ViewController ()
    
    @property(nonatomic,strong)UILabel *label;
    
    @property(nonatomic,strong)kvoCatagory *catagory;
    
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        _catagory = [[kvoCatagory alloc]init];
    

    UIButton *btn = [UIButton buttonWithType: UIButtonTypeCustom ];
    btn.frame = CGRectMake(100, 100, 100, 40);
    [btn setTitle:@"btnclick" forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];

/*1.注册对象myKVO为被观察者:
 option中,
 NSKeyValueObservingOptionOld 以字典的形式提供 “初始对象数据”;
 NSKeyValueObservingOptionNew 以字典的形式提供 “更新后新的数据”;
 */
[self.catagory addObserver:self forKeyPath:@"kvoNum" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];


  }


  /* 2.只要object的keyPath属性发生变化,就会调用此回调方法,进行相应的处理:UI更新:*/
  -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
  {
if([keyPath isEqualToString:@"kvoNum"] && object == self.catagory)
{
  //        // 响应变化处理:UI更新(label文本改变)
  //        self.label.text = [NSString stringWithFormat:@"当前的num值为:%@",[change valueForKey:@"new"]];
  //        
          //上文注册时,枚举为2个,因此可以提取change字典中的新、旧值的这两个方法
    NSLog(@"\noldnum:%@ newnum:%@",[change valueForKey:@"old"],[change valueForKey:@"new"]);
}
  }


  -(void)btnClick:(UIButton *)sender{

//按一次,使num的值+1
self.catagory.kvoNum = self.catagory.kvoNum + 1;



  }



 - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];

/* 3.移除KVO */
[self.catagory removeObserver:self forKeyPath:@"kvoNum" context:nil];
}

KVO 的底层实现:

  1. KVO 的底层实现是通过Objective-C强大的运行时(runtime)实现的。
  2. 当你第一次观察一个对象object时,runtime 会动态地创建一个继承自该对象object所属类的子类,类名格式为为NSKVONotifying_[subclass名],同时保存注册观察者方法中的所有参数,包括监听者、路径、枚举、携带参数等。
  3. 这个新创建的子类重写了所有被观察属性的 setter 方法,并且在内部给观察者发送通知,通知所有观察对象值的更改。
  4. 最后把这个对象object的 isa 指针 ( isa 指针告诉 Runtime 系统这个对象的类是什么类型的 ) 指向这个新创建的子类,此时这个被观察的对象 object 就神奇地变成了新的子类的实例。

相关文章

  • KVO基本使用

    分三部分解释KVO一.KVO基本使用二.KVO原理解析三.自定义实现KVO 一、KVO基本使用 使用KVO,能够非...

  • KVO

    目录 1. KVO的使用1.1 KVO基本使用方法1.2 KVO手动触发模式1.3 KVO属性依赖1.4 KVO容...

  • iOS原理篇(一): KVO实现原理

    KVO实现原理 什么是 KVO KVO 基本使用 KVO 的本质 总结 一 、 什么是KVO KVO(Key-Va...

  • 如何优雅地使用 KVO

    如何优雅地使用 KVO 如何优雅地使用 KVO

  • KVO 原理探究

    [TOC] KVO 研究 没有使用KVO和使用KVO的变化 测试的类Person 通过 objc_copyClas...

  • [iOS] KVO的指导

    nshipster - KVO 如何优雅地使用 KVO

  • iOS-KVO

    一.kvo使用 kvo可以监听一个对象属性的变化,下面为简单使用. 二.使用runtime分析kvo 我写了个简单...

  • KVO如何才能直接监听到数组的变化

    转自关于使用KVO监听数组的问题 首先,数组不能直接使用KVO使用监听。当我们想要使用KVO监听数组的状态时改变然...

  • 20.iOS底层学习之KVO 原理

    本篇提纲1、KVO简介;2、KVO的使用;3、KVO的一些细节;4、KVO的底层原理; KVO简介 KVO全称Ke...

  • iOS 开发Tip2

    51.封装KVO 使用(注意:对UITextfiled使用在真机上不可以使用KVO,KVO是基于KVC,因为通过键...

网友评论

      本文标题:KVO的使用

      本文链接:https://www.haomeiwen.com/subject/tdognttx.html