2012-05-11 50 views
78

CoreData使用级联删除规则,实体“A”与CoreData条目“B”的集合具有一对多关系。CoreData + iCloud +级联删除 - 如何处理?

iCloud环境中,虽然设备1显示了其中一个“B”条目的详细视图,但设备2删除了“A”条目。

NSPersistentStoreDidImportUbiquitousContentChangesNotification通报装置1接收,它的应用程序代理调用mergeChangesFromContextDidSaveNotification,然后广播其通过示出条目“B”的详细视图控制器捕获的内部通知(该代码使用performBlock它应该)。

但是,尽管当详细视图控制器收到内部通知时,条目“A”确实无效,但条目“B”仍作为有效的CoreData对象存在。看来,级联规则尚未完成其运作。因此设备1中的视图控制器不知道删除,这可能会导致意外的结果。

mergeChangesFromContextDidSaveNotification似乎过早地返回,当基础数据已合并但级联规则尚未完成时。

当通知到达时临时设置管理对象上下文的stalenessInterval为零,因此缓存的对象将不会被使用,但我仍然从中获得有效的条目“B”商店。

检查null条目此处的条目“A”不是一个选项,因为情况比我在这里描述的要复杂一些,在某些情况下空条目“A”可能有效。

我试图合并更改后,并在发送内部通知视图控制器之前引入延迟。我发现延迟2秒没有帮助,但延迟10秒。

但我不想依赖这个延迟。这是一个没有太多数据的测试环境,我不知道生产环境会发生什么。依靠实验性延迟似乎不是正确的做法。

有没有正确的事情?或者我开始做错了什么?

+0

还有更多的东西,因为级联删除首先传播:processPendingChanges,保存或结束一个运行循环周期。在正常情况下,你描述的问题不应该存在。 – svena

+0

是NSPersistentStoreDidImportUbiquitousContentChangesNotification附带的NSDeletedObjectsKey数组中详细视图控制器中对象的托管对象ID? – ImHuntingWabbits

+0

这是总是发生还是间歇性?我有一个复杂的等级结构,还没有看到任何孤儿!你是否再次获取实体B,或者可能是因为你以某种方式显示它,你保留对该对象的引用。如果关闭应用程序并重新打开该应用程序会发生什么情况,实体B仍在那里? –

回答

1

根据经验,倾听除NSManagedObjectContextDidSaveNotification以外的通知是一个大混乱,并可能导致依赖尚未更新的属性。详细视图控制器应该监听NSManagedObjectContextDidSaveNotification通知,这些通知在应用级联后抛出。然后,您可以通过多种方法检查当前对象是否有效(您可以检查当前对象的受管对象上下文是否为nil,或者您可以执行提取并查看该对象是否存在于该存储中)。