6

所以我对 Core Data 和 KVO 还很陌生,但是我有一个 NSManagedObject 子类,它成功地观察了它自己的多对多关系。问题是,在观察到的变化上,我只想遍历添加或删除的对象集。有没有办法直接访问这些项目?或者我必须做一些相对低效的事情,比如:

NSSet* newSet = (NSSet*)[change objectForKey:NSKeyValueChangeNewKey];
NSSet* oldSet = (NSSet*)[change objectForKey:NSKeyValueChangeOldKey];

NSMutableSet* changedValues = [[NSMutableSet alloc] initWithSet:newSet];
[changedValues minusSet:oldSet];

我觉得你应该能够避免这种情况,因为在这些消息中......

[self willChangeValueForKey:forSetMutation:usingObjects:];
[self  didChangeValueForKey:forSetMutation:usingObjects:];

您正在将添加/删除的对象交给它!也许了解这些物体会发生什么会有帮助?

4

2 回答 2

5

您是否真的检查过 KV 观察提供的“旧”和“新”值的内容?当我观察到由 触发的可变集合didChangeValueForKey:forSetMutation:usingObjects:中的更改时, NSKeyValueChangeNewKey 的更改字典值仅包含任何添加的对象,而 NSKeyValueChangeOldKey 的值仅包含任何已删除的对象,因此您不必手动找出发生了什么变化。但是,触发的观察didChangeValue:forKey: 将为您提供 NSKeyValueChangeOldKey 的整个旧集合和 NSKeyValueChangeNewKey 的整个新集合,即使它们具有相同的内容。

于 2011-11-07T19:53:24.813 回答
2

当你注册观察一个对象时,包括NSKeyValueObservingOptionNew选项(和NSKeyValueObservingOptionOld,如果你愿意的话)。

于 2011-07-05T18:14:34.447 回答