ios - 在 KVO 中使用嵌套键路径

标签 ios objective-c key-value-observing

假设我想观察一个名为“isEnabled”的属性' 在 self 上名为“controller”的属性上。据我所知,我有两种选择来安装此类观察:

1.[self.controller addObserver:self forKeyPath:@"isEnabled" options:0 context:nil];
2.[self addObserver:self forKeyPath:@"controller.isEnabled" options:0 context:nil];

我注意到这两种方法之间的实际差异 - 在第二种方法中,如果自身上的“ Controller ”对象被替换,我会收到通知,而在第一种方法中,只有在“isEnabled”时我才会收到通知。 ' 属性在我安装观察的同一实例上更改。

我的问题是,如果有的话,这个记录到底在哪里?我知道它有效,但我应该使用它吗?
尽管其他一些人在论坛中提到过,但我在苹果文档中找不到任何提及此类行为的信息。任何引用都将很乐意接受。

谢谢。

最佳答案

如果 controller 属性发生更改,您不仅会收到更改通知,而且 KVO 将切换到跟踪新 Controller 的 isEnabled 属性并停止跟踪旧 Controller 的 isEnabled 属性。

这隐含在关键路径的概念中。键值观察建立在键值编码之上。 《键值编码编程指南》在 Key-Value Coding Fundamentals 中介绍了有关关键路径的内容。 :

A key path is a string of dot separated keys that is used to specify a sequence of object properties to traverse. The property of the first key in the sequence is relative to the receiver, and each subsequent key is evaluated relative to the value of the previous property.

For example, the key path address.street would get the value of the address property from the receiving object, and then determine the street property relative to the address object.

-addObserver:forKeyPath:options:context: 的含义不是“沿着关键路径到达最终元素并观察倒数第二个对象上的该属性”。它是“观察接收者对象的这个关键路径”。关键路径始终被认为是从接收者开始。

换句话说,对于您的第二个代码示例,它不是“观察 selfcontrollerisEnabled 属性”(即你的第一个例子的含义)。含义是“观察 selfcontroller.isEnabled。任何时候计算表达式 [self valueForKeyPath:@"controller.isEnabled"]< 的结果 已经或可能已经改变,请通知我。”

I know it works but should I use it?

是的,你应该使用它。这就是 API 的本意。这就是为什么该方法将其参数描述为键路径而不仅仅是键。

关于ios - 在 KVO 中使用嵌套键路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28167684/

相关文章:

ios - 使用 swift 和 market 查找附近的酒吧

ios - 注册 UITableViewCell 以供重用时,该单元格上的哪个 init 方法被调用?

ios - [iOS]KVO setValuesForKeysWithDictionary

objective-c - 在模型更改时自动更新 NSOutlineView,无需 NSTreeController

两个类(class)之间的iPhone KVO

ios - 为 SKSpriteNode 生成位置

ios - 写入可由应用程序中的 JS 文件读取的 txt 文件

ios - 检查连接并执行到第二个 View Controller 的 segue

iphone - iOS 5 中 UILabel 的多色

objective-c - Xcode:删除行热键