gpt4 book ai didi

objective-c - 什么时候使用 KVO?

转载 作者:太空狗 更新时间:2023-10-30 03:17:42 26 4
gpt4 key购买 nike

我已经阅读了很多关于 KVO 的文档,但我仍然对何时使用它感到困惑。

如果 objA 想要监控 objB 的某个属性,像这样:

self.objB = [[ObjB alloc] init];
[self.objB addObserver:self
forKeyPath:@"address"
options:0
context:nil];

所以如果 objB 的属性改变了,而且它只能被 self 改变,为什么不这样做:

self.objB.property = @"newValue";
[self doSomethingBasedOnNewValueOfObjBnewProperty];

代替

- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context

{
if(keyPath == @"address") {
[self doSomethingBasedOnNewValueOfObjBnewProperty];
}
}

它在与单例一起使用时可能很有用,例如 self.objB = [ObjB sharedInstance],其中属性可能会被其他对象更改。这是唯一的用例吗?

最佳答案

并非所有类的所有实例都仅由同一个实例创建和编辑(这实际上是您的示例所表明的)。

KVO 是一种通用方法,一个实例可以通过它观察另一个实例的变化并接收发生的通知。这些更改可以从任何地方触发。

假设您向项目中添加了一个第 3 方库。你不知道它是如何实现的。调用一个方法可能会更改库类实例中的多个不同属性。 KVO 为您提供了一种简单的方法来监视这些更改并对其使用react。

KVO 还提供“依赖键”,它允许您配置键之间的关系,这样您就可以说“此属性的值取决于另一个对象中一个或多个其他属性的值”,KVO 会在它发生时告诉您。这在托管对象子类中特别有用,比如,如果您有一个临时键,该键保存某个持久键的缓存值,并且缓存需要在持久值更改时更新...

关于objective-c - 什么时候使用 KVO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17007660/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com