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


78

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

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

NSPersistentStoreDidImportUbiquitousContentChangesNotification在设备1中接收到通知时,其App委托将进行调用mergeChangesFromContextDidSaveNotification,然后广播一个内部通知,该内部通知将由视图控制器捕获,其中显示条目“ B”的详细信息(代码performBlock在应使用的位置使用)。

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

mergeChangesFromContextDidSaveNotification 基本数据已合并但Cascade规则尚未完成时,似乎会过早返回。

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

null此时不选择检查条目“ A”,因为情况比我在此描述的要复杂得多,在某些情况下,空条目“ A”可能是有效的。

我试图在合并更改之后并在将内部通知发送给视图控制器之前引入延迟。我发现2秒钟的延迟无济于事,但10秒钟的延迟有效。

但我不想依靠这种延迟。这是一个没有大量数据的测试环境,我不知道在生产环境中会发生什么。依靠实验性的延迟似乎不是正确的事情。

有没有对的事?还是我开始做错了什么?


由于级联删除会在第一个出现时立即传播,因此它的作用远非看上去那么多:processPendingChanges,保存或运行循环周期结束。在正常情况下,您描述的问题不应该存在。
svena

NSPersistentStoreDidImportUbiquitousContentChangesNotification随附的NSDeletedObjectsKey数组中详细视图控制器中对象的托管对象ID是什么?
ImHuntingWabbits 2012年

这是经常发生还是断断续续的?我有一个复杂的层次结构,还没有看到任何孤儿!您是要再次获取实体B,还是因为您以某种方式显示实体B而保留了对该对象的引用。如果您关闭应用程序并重新打开它,而实体B仍然存在,会发生什么情况?
Duncan Groenewald

3
@Amiram一年半。你得到答案了吗?:)
浅蓝色点

Answers:


1

从经验来看,听通知不是NSManagedObjectContextDidSaveNotification一团糟,并且可能导致依赖尚未更新的属性。详细信息视图控制器应侦听NSManagedObjectContextDidSaveNotification在应用级联后引发的通知。然后,您可以通过多种方式检查当前对象是否有效(可以检查当前对象的托管对象上下文是否有效,nil或者可以执行访存并查看对象是否存在于存储中)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.