NSCountedSet上的KVO?

Mel*_*emi 4 cocoa cocoa-touch key-value-observing

我想监视NSCountedSet以查看其内容是否发生了变化.设置KVO似乎是编译但它没有被触发.第一个问题:你能观察到一套吗?如果是这样,那么这条消息有问题吗?

    [subViewA addObserver:subViewB forKeyPath:@"countedSet" options:0 context:NULL];
Run Code Online (Sandbox Code Playgroud)

我真的只是想监视计数的(在对象的数量)设定是否有帮助.

编辑 - 这是观察者(subViewB):

- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context {
    if ([keyPath isEqual:@"countedSet"]) {
        NSLog(@"Set has changed");
    }
}
Run Code Online (Sandbox Code Playgroud)

Edit2 - 将addObserver消息从subView移动到viewController.所以我试图让一个subView观察另一个viewController的子视图中的NSCountedSet.关键路径是"相对于接收器" - 我假设它是subViewA.

Pet*_*sey 7

直接与设置对象交谈不会发出KVO更改通知.您需要以符合KVC的方式更改属性的设置值.有两种方法:

  1. 向业主发送mutableSetValueForKey:消息.这将为您提供一个假设置对象,该对象包装该属性并围绕您对其所做的每个更改发布KVO通知.
  2. 为属性实现set访问器方法,并在任何地方使用它们.每个方法的实现直接与底层集合对象进行对话; 所有不在这些方法之一的代码都应该通过它们.因此,例如,要添加对象,您不应该使用[myCountedSet addObject:foo](除了addCountedSetObject:); 你应该用[self addCountedSetObject:foo].

我推荐#2.听起来似乎更多的工作,但它并不多,而且它可以提供非常好的代码.

"模型对象实施指南""核心数据编程指南"中的更多详细信息(即使这不是特定于核心数据).

  • 请注意,对于数组也是如此.如果你从KVO下改变一个可变数组,它将不会发送通知. (2认同)