所以我对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:];
你正在处理添加/删除的对象!或许知道这些对象会发生什么有用吗?
答案 0 :(得分:5)
您是否真的检查了KV观察提供的“旧”和“新”值的内容?当我观察到由didChangeValueForKey:forSetMutation:usingObjects:
触发的可变集的更改时,NSKeyValueChangeNewKey的更改字典值仅保存任何添加的对象,而NSKeyValueChangeOldKey的值仅保存任何已删除的对象,因此您不必手动弄清楚发生了什么变化。但是,由didChangeValue:forKey:
触发的观察将为NSKeyValueChangeOldKey提供整个旧集合,并为NSKeyValueChangeNewKey提供整个新集合,即使它们具有相同的内容。
答案 1 :(得分:2)
当您注册观察某个对象时,请添加NSKeyValueObservingOptionNew选项(如果需要,还可以NSKeyValueObservingOptionOld)。