Core data 核心数据合并更改自ContextDidSaveNotification性能

Core data 核心数据合并更改自ContextDidSaveNotification性能,core-data,Core Data,我正在后台队列中导入大量数据。每条路线有几千个位置s 我正在导入一个NSPrivateQueueConcurrencyType 在以下方法中,我将获取我创建的每个对象,即路线和位置 - (void)contextDidSave:(NSNotification*) notification 这意味着我有大量的对象需要在主线程上从ContextDidSaveNotification进行mergeChangesFromContextDidSaveNotificationed,尽管最初我只需要路由,甚

我正在后台队列中导入大量数据。每条
路线
有几千个
位置
s

我正在导入一个
NSPrivateQueueConcurrencyType

在以下方法中,我将获取我创建的每个对象,即路线和位置

- (void)contextDidSave:(NSNotification*) notification
这意味着我有大量的对象需要在主线程上从ContextDidSaveNotification进行
mergeChangesFromContextDidSaveNotification
ed,尽管最初我只需要路由,甚至可能不需要路由

当对象不感兴趣时(例如,尚未发出提取请求时),如何跳过合并对象


如何仅合并
路由
并在需要
位置时让它们延迟加载?

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

如果您不使用父/子设计,我建议将其改为That’s design以消除此瓶颈

在合并过程中,您仍然可以使用主线程,但它将得到显著改进

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

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


如果导入的对象没有在主上下文中注册(例如错误的关系),则性能非常好。比使用子上下文导入快十倍。如果您正在导入关系,则很可能出现这种情况。

您是否可以限定为什么“它将得到显著改进”?因为通知用于通知一个上下文与另一个上下文之间的更改。这涉及两次加载对象并比较数据。那太贵了。当上下文是父/子上下文时,通知在内部被用于核心数据,对象已经被提取,这更多的是一些指针数学,而不是比较。这是对您当前使用的旧的通知使用设计的一个重大改进。好的,很好。但是,如果没有必要,我想做的是跳过主要上下文。如果我根本不合并,我会实现这一点,但我不会在我的NSFetchedResultsController中看到新导入的对象。如果我没有任何对这些对象感兴趣的NSFetchedResultsController,那就没关系了。如果设置了父/子对象,则根本不需要跳过主上下文。性能的改进应该消除了围绕主环境跳舞的需要。然而,在所有情况下,您需要将PSC的锁定降至最低,这样频繁的保存将是一个很大的好处。