志愿上NSCountedSet?(KVO on an NSCountedSet?)

2019-08-31 14:02发布

我想监视NSCountedSet,看看它的内容变化。 建立志愿似乎编译,但它没有被触发。 第一个问题:你可以观察一组? 如果是的话是有什么错此消息?

    [subViewA addObserver:subViewB forKeyPath:@"countedSet" options:0 context:NULL];

我真的只是想监控的计数 (在对象的数目)设定是否有帮助。

编辑 - 这里的观察者(subViewB):

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

EDIT2 -从子视图到ViewController移动的addObserver消息。 所以我试图让一个子视图在另一个的viewController的子视图来观察NSCountedSet。 关键路径是“相对于接收器” - 我假设是subViewA。

Answer 1:

直接对话所设定的目标不会发出志愿更改通知。 您需要更改的KVC兼容的方式属性的设定值。 有两种方法:

  1. 发送业主一个mutableSetValueForKey:消息。 这会给你一个包装属性假集对象和职位志愿通知各地各改变你做它。
  2. 实施该属性的set访问方法,到处使用它们。 直接在每个方法会谈到底层设置对象的执行; 所有的代码,是不是在这些方法中的一个应该通过他们去。 因此,举例来说,增加一个对象,你不应该使用[myCountedSet addObject:foo]addCountedSetObject: ); 你应该使用[self addCountedSetObject:foo]代替。

我推荐#2。 这听起来像更多的工作,但它的并不多,而它使真正的好代码。

更多细节的模型对象实现指南和核心数据编程指南 (尽管这不是针对核心数据)。



Answer 2:

肯定有志愿无序的一对多关系手动更改的方法。

难道你不希望被设置你的选项为非零? 例如, NSKeyValueObservingOptionNew

此外迈克灰的志愿助手是相当出色的。

从上的addObserver的NSSet中的文档:

的NSSet对象是无法观测,所以一个NSSet中对象上调用该方法时引发一个例外。 相反,观察组,观察无序一对多的关系为其设定为相关对象的集合。



Answer 3:

有些事情要检查:

  1. myControllernil ? 如果它是nil ,在addObserver::::消息只是落在地板上默默。
  2. 是您的方法获取调用呢? 也许它被称为,但不是你所期望的关键路径。 (我不希望这样,要么,但它是值得一试。)


文章来源: KVO on an NSCountedSet?