对于具有不同对象ID的1个插入,NSFetchedResultsChangeInsert被调用两次

时间:2013-03-29 02:51:07

标签: ios core-data

我对这个问题感到失望。

所以我的iOS应用程序中有一个Core Data设置就是这样做的: http://www.cocoanetics.com/2012/07/multi-context-coredata/

然后我通过创建临时MOC(如博客文章中所述)插入对象,并在performBlock:方法中对所有3个上下文执行保存。

在视图控制器中,我有一个NSFetchedResultsController,它会收到通知我确实插入了一个新对象。问题是NSFetchedResultsChangeInsert被触发两次,每次传递的对象都有不同的objectID(它也是内存中的不同对象实例)。然后我在表视图中插入了2行但是在SQL数据库中只有一行是新的。当我滚动到表格视图的底部时,它当然会崩溃。

如果我还对对象执行了一些更新,我只调用一次NSFetchedResultsChangeUpdate,并使用在第二次NSFetchedResultsChangeInsert调用中传递的objectID。

第一个ID如下所示:

  

<x-coredata:///ReceivedMessage/t605BB9A7-A04E-4B89-B568-65B12E8C259A2>

第二个(以及所有后续的)像这样:

  

<x-coredata://02A917C5-850F-4C67-B8E4-1C5790CF3919/ReceivedMessage/p28>

这可能是什么?我错过了一些明显的东西吗?

PS:我还检查了通知是否来自相同的上下文,线程等。确实如此。

1 个答案:

答案 0 :(得分:2)

您看到的两个ID可能很好地代表一个对象。它们之间的区别仅在于第一个是临时对象ID,在创建时分配给对象,第二个是永久对象ID,在将对象存储到托管对象库时分配给该对象(请参阅{{ 3}})。

要解决此问题,您可以在保存临时MOC之前调用NSManagedObjectID's isTemporaryID。这样插入的对象在保存传播期间只有一个ID,NSFetchedResultsControllerDelegate方法应该只调用一次。