我对这个问题感到失望。
所以我的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:我还检查了通知是否来自相同的上下文,线程等。确实如此。
答案 0 :(得分:2)
您看到的两个ID可能很好地代表一个对象。它们之间的区别仅在于第一个是临时对象ID,在创建时分配给对象,第二个是永久对象ID,在将对象存储到托管对象库时分配给该对象(请参阅{{ 3}})。
要解决此问题,您可以在保存临时MOC之前调用NSManagedObjectID's isTemporaryID。这样插入的对象在保存传播期间只有一个ID,NSFetchedResultsControllerDelegate方法应该只调用一次。