美文网首页ios面试题
如何手动触发一个value的KVO?

如何手动触发一个value的KVO?

作者: 充满活力的早晨 | 来源:发表于2018-04-10 10:19 被阅读40次

所谓的“手动触发”是区别于“自动触发”:
自动触发是指类似这种场景:在注册 KVO 之前设置一个初始值,注册之后,设置一个不一样的值,就可以触发了。
想知道如何手动触发,必须知道自动触发 KVO 的原理:
键值观察通知依赖于 NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey: 。在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧的值。而当改变发生后, observeValueForKey:ofObject:change:context: 会被调用,继而 didChangeValueForKey: 也会被调用。如果可以手动实现这些调用,就可以实现“手动触发”了。
那么“手动触发”的使用场景是什么?一般我们只在希望能控制“回调的调用时机”时才会这么做。
具体做法如下:
如果这个 value 是 表示时间的 self.now ,那么代码如下:最后两行代码缺一不可。

//  .m文件
//  手动触发 value 的KVO,最后两行代码缺一不可。
//@property (nonatomic, strong) NSDate *now;
- (void)viewDidLoad {
   [super viewDidLoad];
   _now = [NSDate date];
   [self addObserver:self forKeyPath:@"now" options:NSKeyValueObservingOptionNew context:nil];
   NSLog(@"1");
   [self willChangeValueForKey:@"now"]; // “手动触发self.now的KVO”,必写。
   NSLog(@"2");
   [self didChangeValueForKey:@"now"]; // “手动触发self.now的KVO”,必写。
   NSLog(@"4");
}

但是平时我们一般不会这么干,我们都是等系统去“自动触发”。“自动触发”的实现原理:
比如调用 setNow: 时,系统还会以某种方式在中间插入 wilChangeValueForKey: 、 didChangeValueForKey: 和 observeValueForKeyPath:ofObject:change:context: 的调用。
大家可能以为这是因为 setNow: 是合成方法,有时候我们也能看到有人这么写代码:

- (void)setNow:(NSDate *)aDate {
   [self willChangeValueForKey:@"now"]; // 没有必要
   _now = aDate;
   [self didChangeValueForKey:@"now"];// 没有必要
}

这完全没有必要,不要这么做,这样的话,KVO代码会被调用两次。KVO在调用存取方法之前总是调用 willChangeValueForKey: ,之后总是调用 didChangeValueForkey: 。怎么做到的呢?答案是通过 isa 混写(isa-swizzling)。

相关文章

  • iOS KVO的手动实现过程

    如何手动触发一个value的KVO 手动实现 willChangeValueForKey 和 didChangeV...

  • iOS面试题-OC

    1. 如何手动触发一个value的KVO NSObject 有 willChangeValueForKey: 和...

  • IOS问题与解答

    对KVO原理的理解: 问:如何手动触发一个value的KVO 答:主动调用: willChangeValueFor...

  • KVO

    iOS用什么方式实现对一个对象的KVO 如何手动触发KVO 直接修改成员变量会触发KVO么? KVO [self....

  • 04. KVO使用,原理,本质

    问题 KVO日常使用 KVO原理(KVO本质是什么) 如何手动触发KVO 直接修改成员变量会触发KVO吗 KVO图...

  • 如何手动触发一个value的KVO?

    所谓的“手动触发”是区别于“自动触发”:自动触发是指类似这种场景:在注册 KVO 之前设置一个初始值,注册之后,设...

  • 如何手动触发一个value的KVO

    所谓的“手动触发”是区别于“自动触发”: 想知道如何手动触发,必须知道自动触发KVO的原理: 转载自《猿圈》 那么...

  • 如何手动触发一个 value 的 KVO ?

    自动触发场景:在注册 KVO 之前设置一个初始值,注册之后,设置一个不一样的值,这样就可以触发了。 手动触发:

  • 如何手动触发一个 value 的 KVO?

    原文:iOS面试题大全 KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种...

  • 深入理解KVO

    iOS | KVO | Objective-C KVO的本质是什么,如何手动触发KVO? 1.什么是KVO KVO...

网友评论

    本文标题:如何手动触发一个value的KVO?

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