Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c KVO和核心数据,通过观察仅获取更改的值_Objective C_Core Data_Key Value Observing_Nsset - Fatal编程技术网

Objective c KVO和核心数据,通过观察仅获取更改的值

Objective c KVO和核心数据,通过观察仅获取更改的值,objective-c,core-data,key-value-observing,nsset,Objective C,Core Data,Key Value Observing,Nsset,所以我对核心数据和KVO是相当陌生的,但我有一个NSManagedObject子类,它成功地观察到了自己的多对多关系。问题是,对于观察到的更改,我只想遍历添加或删除的对象集。是否有直接访问这些项目的方法?或者我必须做一些相对低效的事情,比如: NSSet* newSet = (NSSet*)[change objectForKey:NSKeyValueChangeNewKey]; NSSet* oldSet = (NSSet*)[change objectForKey:NSKeyValueCha

所以我对核心数据和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:];

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

当您注册观察一个物体时,包括该选项(如果您愿意,也包括该选项)。

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

谢谢,我已经这样做了,但很好地澄清了这一点。如果可能的话,我还是宁愿避免这个解决方案。啊,谢谢!我想我只是从集合中减去已经丢失的项目,然后:P我相信我在苹果文档中的某个地方读到了后一种情况,但我没有意识到它对
didChangeValueForKey:with setmutation:usingObjects:
的应用是不同的,不是很直观吗?