核心数据mergeChangesFromContextDidSaveNotification性能

时间:2014-05-29 11:51:24

标签: core-data

我在后台队列中导入大量数据。每个Route都有几千Location秒。

我正在导入NSPrivateQueueConcurrencyType

在下面的方法中,我得到了我创建的每个对象,即路由和位置。

- (void)contextDidSave:(NSNotification*) notification

这意味着我有大量的对象需要在主线程上mergeChangesFromContextDidSaveNotification编写,尽管最初我只需要路由,甚至可能不需要路由。

如何在不感兴趣的情况下跳过合并对象,例如什么时候没有提取请求?

如何合并Route,当我需要Location时,让它们延迟加载?

2 个答案:

答案 0 :(得分:1)

假设您使用的是父/子设计,则无需使用这些通知。只有在处理两个未连接的上下文时才应使用这些通知。

如果您没有使用父/子设计,我建议将其更改为该设计以消除此瓶颈。

在合并期间,您仍会使用主线程,但会得到显着改善。

答案 1 :(得分:0)

[mainContext mergeChangesFromContextDidSaveNotification:notification]

在上面的示例中,如果已导入的对象已在主上下文中注册,则mergeChangesFromContextDidSaveNotification将命中主线程。如果NSFetchedResultsControllers正在获取所有结果,则可能会发生这种情况。

Marcus在他的回答评论中解释了为什么使用子上下文更快地保存注册对象。

如果导入的对象尚未在主要上下文中注册(例如,出现故障关系),则表现非常好。比使用子上下文导入快十倍。如果您要导入关系,则很可能出现这种情况。