我在后台队列中导入大量数据。每个Route
都有几千Location
秒。
我正在导入NSPrivateQueueConcurrencyType
。
在下面的方法中,我得到了我创建的每个对象,即路由和位置。
- (void)contextDidSave:(NSNotification*) notification
这意味着我有大量的对象需要在主线程上mergeChangesFromContextDidSaveNotification
编写,尽管最初我只需要路由,甚至可能不需要路由。
如何在不感兴趣的情况下跳过合并对象,例如什么时候没有提取请求?
如何合并Route
,当我需要Location
时,让它们延迟加载?
答案 0 :(得分:1)
假设您使用的是父/子设计,则无需使用这些通知。只有在处理两个未连接的上下文时才应使用这些通知。
如果您没有使用父/子设计,我建议将其更改为该设计以消除此瓶颈。
在合并期间,您仍会使用主线程,但会得到显着改善。
答案 1 :(得分:0)
[mainContext mergeChangesFromContextDidSaveNotification:notification]
在上面的示例中,如果已导入的对象已在主上下文中注册,则mergeChangesFromContextDidSaveNotification
将命中主线程。如果NSFetchedResultsControllers
正在获取所有结果,则可能会发生这种情况。
Marcus在他的回答评论中解释了为什么使用子上下文更快地保存注册对象。
如果导入的对象尚未在主要上下文中注册(例如,出现故障关系),则表现非常好。比使用子上下文导入快十倍。如果您要导入关系,则很可能出现这种情况。