CoreData + iCloud + 级联删除-如何处理?

使用级联删除规则,CoreData实体“ A”与 CoreData条目“ B”的集合具有一对多关系。

iCloud环境中,当设备1显示一个“ B”条目的详细视图时,设备2删除“ A”条目。

当设备1接收到 NSPersistentStoreDidImportUbiquitousContentChangesNotification通知时,其应用程序代理调用 mergeChangesFromContextDidSaveNotification,然后广播一个内部通知,该通知由视图控制器捕获,显示条目“ B”的细节(代码在应该使用 performBlock的地方使用)。

However, although entry "A" is indeed nullified when the detail view controller receives the internal notification, entry "B" still exists as a valid CoreData object. It seems that the Cascade rule hasn't completed its operation yet. Therefore the view controller in device 1 isn't aware of the delete, which may lead to unexpected results.

当基本数据已经合并但级联规则尚未完成时,mergeChangesFromContextDidSaveNotification似乎提前返回。

当通知到达时,我尝试刷新条目“ B”,同时临时将托管对象上下文的 stalenessInterval设置为零,这样就不会使用缓存的对象,但我仍然从存储中获得有效条目“ B”。

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

我尝试在合并更改之后和向视图控制器发送内部通知之前引入延迟。我发现2秒钟的延迟是没用的,但是10秒钟的延迟是有用的。

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

有正确的事吗? 还是我一开始就做错了?

1925 次浏览

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