KVO addObserver与CoreData对象的一对多关系

Pet*_*eka 9 core-data objective-c key-value-observing ios

大家好几年读StackOverflow,现在我决定加入.我正在努力解决这个问题:

我有一个"仓库"实体,它有两对多的关系"人"和"卡车".我想观察一下,给定一个"Depot"对象,其中一个关系中有变化(插入,删除)(并理解其中一个).

目前我这样做:

[mydepot addObserver:self forKeyPath:@"Trucks" options:NSKeyValueObservingOptionNew context:nil];

[mydepot addObserver:self forKeyPath:@"Persons" options:NSKeyValueObservingOptionNew context:nil];

但是每当两个相关集合中的某个集合发生变化时,observeValueForKeyPath就会被调用两次(每个密钥路径一次).

我做错了吗?查看"更改"字典,(与OptionOld一起观察)显示没有意外的变化(当我改变人员时,卡车没有改变),但仍然提出通知.

谢谢,彼得罗

编辑:似乎两次"更改"字典都包含"新"字段中的整个关系.(显然有一次人和一次卡车)

edit2:因为它甚至保留了简单的属性,它是否与managedctx保存操作有关?好像在保存时,整个对象被认为已经改变了..

Mun*_*ndi 9

在Key Value Observing Programming Guide中,它说明了这一点

如果您正在使用Core Data,则可以将父项作为其托管对象上下文的观察者注册到应用程序的通知中心.家长应以类似于键值观察的方式回应孩子们发布的相关变更通知.

这实际上可能意味着建议的做法不是使用addObserver:forKeyPath:options:context:,而是注册NSManagedObjectContextDidSaveNotification代替.


nie*_*bot 3

如果您以原子方式设置卡车 ( something.trucks = newArray),您将收到一个值设置通知。而是在 . 返回的可变数组上使用 addObject/removeObject [ something mutableArrayValueForKey:@"trucks" ]

您还可以使用/实现 KVO 生成的访问器insertObjectIntoTrucks:countOfTrucks

您应该阅读 KVO 文档。在“索引对多关系合规性”和“无序对多关系合规性”