OC KVO

1. KVO 是什么?

KVO是OC观察者模式的一种实现(另一种是NSNotification);

KVO提供一种机制, 制定一个被观察对象(例:Person类), 当对象某个属性(例:name)发生改变时, 对象会获得通知, 并作出相应的处理; 且不需要给被观察对象添加任何代码.

在MVC架构下的项目, KVO机制很适合实现Model和View之间的通讯.

例: 在model_B创建属性数据, 在控制器中创建观察者, 一旦属性数据发生改变观察者就收到通知, 通过KVO在控制器使用回调方法实现view_C的更新.

2. 基本实现原理

当观察某对象A时, KVO机制会动态创建一个对象A的子类NSKVONotifying_A, 并为这个新类重写被观察属性name(即keyPath)的setter方法. setter方法随后负责通知观察对象属性的变化.

3. 特点

观察者观察的是属性, 只有遵循KVO变更属性的方式才会执行KVO的回调方法, 即是否执行科setter方法或者是否使用了KVC赋值. 如果没有, 而是直接修改属性对应的成员变量(_name = @"花花")是不会触发KVO机制的. 所以, 使用KVO机制的前提是遵循KVO的属性设置方式来变更属性值.

4. 应用

self.myKVO=[[myKVO alloc]init];

/*1.注册对象myKVO为被观察者: option中, 

NSKeyValueObservingOptionOld 以字典的形式提供 “初始对象数据”;

NSKeyValueObservingOptionNew 以字典的形式提供 “更新后新的数据”; */

[self.myKVO addObserver:selfforKeyPath:@"num" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];

/* 2.只要object的keyPath属性发生变化,就会调用此回调方法,进行相应的处理:UI更新:*/

-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary<NSString*,id>*)change context:(void*)context{

// 判断是否为self.myKVO的属性“num”:

if([keyPath isEqualToString:@"num"]&&object==self.myKVO){

    // 响应变化处理:UI更新(label文本改变)

    self.label.text=[NSString stringWithFormat:@"当前的num值为:%@",[change valueForKey:@"new"]];

    //change的使用:上文注册时,枚举为2个,因此可以提取change字典中的新、旧值的这两个方法  

     NSLog(@"\\noldnum:%@ newnum:%@",

    [change valueForKey:@"old"],

    [change valueForKey:@"new"]);

  }

}

/*KVO以及通知的注销,一般是在-(void)dealloc中编写。

至于很多小伙伴问为什么要在didReceiveMemoryWarning?因为这个例子是在书本上看到的,所以试着使用它的例子。

但小编还是推荐把注销行为放在-(void)dealloc中。(严肃脸😳)

*/

-(void)didReceiveMemoryWarning{[superdidReceiveMemoryWarning];

/* 3.移除KVO */

[self.myKVO removeObserver:selfforKeyPath:@"num"context:nil];

}

//按钮事件

-(IBAction)changeNum:(UIButton*)sender{

//按一次,使num的值+1

self.myKVO.num=self.myKVO.num+1;

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • KVO是什么 kvo:Key-Value Observing(键值观察),键值观察是一种机制,它允许将其他对象的指...
    浪的出名阅读 571评论 0 2
  • KVC: 定义: KVC全称是Key Value Coding(键值编码),是一个基于NSKeyValueCodi...
    飞哥漂流记阅读 1,225评论 0 0
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,759评论 0 4
  • KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过K...
    暮年古稀ZC阅读 2,173评论 2 9
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 4,338评论 0 13