OC KVO

作者: mikey_Jiang | 来源:发表于2020-12-15 10:59 被阅读0次

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;

}

相关文章

  • swift中KVO和属性观察器

    开篇提醒:OC中的KVO及其KVO的基础知识可参见:深入runtime探究KVO Swift中,原本没有KVO模式...

  • iOS KVO的底层实现原理

    KVO 是 OC 观察者设计模式的一种KVO 的实现依赖于 OC 强大的 RuntimeKVO是Cocoa提供的...

  • KVO

    今天和大家讨论一下OC中KVO(KeyValueObserving)键值观察 KVO定义 KVO是iOS开发中的一...

  • OC的KVO学习记录(2)

    仿写KVO的实现KVO原理参考可前一篇OC的KVO学习记录代码github地址:Sameny仿写KVO 注:关键代...

  • OC KVO

    1. KVO 是什么? KVO是OC观察者模式的一种实现(另一种是NSNotification[https://w...

  • iOS知识点小结

    1.KVO1.1> KVO 简介:KVO 是 OC 观察者设计模式的一种实现.KVO 指定一个被观察的对象的属性,...

  • OC观察者模式之KVO

    KVO: KVO是key-value observing的缩写 KVO是OC对观察者设计模式的又一实现 苹果使用了...

  • KVO读书笔记

    KVO是什么 KVO 是 OC 对 观察者模式的实现。 KVO提供一种机制,指定一个被观察对象A,...

  • iOS 自定义KVO

    自己实现kvo之前,需要知道iOS系统对kvo的实现。 系统实现kvo的原理 这依赖了OC强大的runtime特性...

  • 整理面试题

    一、OC语言基础知识剖析 (1)UI卡顿掉帧的原因 (1)什么是KVO? KVO实现原理?如何手动添加KVO? <...

网友评论

      本文标题:OC KVO

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