有没有办法告诉KVO何时开始/结束特定值?

时间:2011-11-27 09:27:58

标签: objective-c ios key-value-observing

我有一些在集合上计算的值,并且在任何给定时间可能会或可能不会显示(因此可能有也可能没有观察者)。如果没有人观察我的计算值,我宁愿不必跟踪集合的所有成员。

我可以判断是否有人正在观察某个值,我可以告诉他们什么时候开始观察吗?

我知道对于一个给定的对象foo我可以使用[foo observationInfo]来获取一个观察者列表,其中的关键路径在foo注册了一个根,但是没有自动获取所有路径TO foo(实际上它只会被注册以观察foo的自键)。

2 个答案:

答案 0 :(得分:3)

从设计的角度来看,这不是一个好主意。如果你真的坚持不在没人需要时更新内容(这可能是合法的情况,例如,如果更新很昂贵),你可以引入启动/停止更新的方法:

- (void) beginUpdatingContents;
- (void) endUpdatingContents;

这些应该与班级内的计数器相关联,如果计数器是> 0,你知道有人想要更新内容。这个解决方案是明确的,因此比使用KVO的无声魔法更好。

答案 1 :(得分:2)

如果你想要更多魔法,那么覆盖addObserver:forKeyPath:options:context:removeObserver:forKeyPath:以及跟踪仍在观察你的内容会如何?

我过去实际执行此操作的方法是创建包装器对象(我称之为绑定),这些对象设置KVO并将自己注册到目标。因此,用户可以拨打MyBinding *binding = [targetObject bindKeyPath:@"foo" ...],然后再拨打[binding detach]。然后,您可以在引擎盖下使用KVO绑定并保留一份自己的列表,以便您知道它何时为空。