1

我对这个问题失去了理智。

所以我在我的 iOS 应用程序中设置了核心数据: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:我还检查了通知是否来自相同的上下文、线程等。确实如此。

4

1 回答 1

3

您看到的两个 ID 很可能代表一个对象。它们之间的区别只是第一个是临时对象 ID,在创建时分配给对象,第二个是永久对象 ID,在对象存储到托管对象存储时分配给对象(参见NSManagedObjectID 的 isTemporaryID)。

要解决此问题,您可以在保存临时 MOC 之前调用NSManagedObjectContext 的 gainPermanentIDsForObjects:error:。这样,在保存传播期间插入的对象将只有一个 ID,并且 NSFetchedResultsControllerDelegate 方法应该只调用一次。

于 2013-03-31T18:12:28.067 回答