我有一些在集合上计算的值,并且在任何给定时间可能会或可能不会显示(因此可能有也可能没有观察者)。如果没有人观察我的计算值,我宁愿不必跟踪集合的所有成员。
我可以判断是否有人正在观察某个值,我可以告诉他们什么时候开始观察吗?
我知道对于一个给定的对象foo
我可以使用[foo observationInfo]
来获取一个观察者列表,其中的关键路径在foo注册了一个根,但是没有自动获取所有路径TO foo(实际上它只会被注册以观察foo的自键)。
答案 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绑定并保留一份自己的列表,以便您知道它何时为空。