我正在NSOperation
中保存网络响应中的对象。据我了解合并MOC从后台线程到main的更改,我可以将mergeChangesFromContextDidSaveNotification
或performBlock
与父上下文一起使用。
我更喜欢使用mergeChangesFromContextDidSaveNotification
或performBlock
?
每种合并方法的优缺点是什么?
NSOperation
在后台环境中执行。那么当我打电话给performBlock
时会不会创建新线程?
答案 0 :(得分:1)
答案在很大程度上取决于您的背景MOC是否将主要MOC作为父母。
如果您正在使用具有私有/主要队列并发性的MOC,则只需使用performBlock
。
如果您是,要在相应的正确队列中执行命令,您可以使用performBlock
。
因此,即使您必须使用mergeChanges
- 而且您不必使用子语境 - 您也可以将mergeChanges
嵌套在performBlock
中!但是,您不必使用子环境的原因是因为您的背景线程" MOC 应该可以是主线程MOC的子代。所以你要做的就是save
孩子将变化合并到父母中。 (注意父母也需要保存)
回到这个问题:
mergeChanges
如果您不将更改从子级推送到父级MOC并保存在子级中performBlock
但在主线程上的mainQueueMOC上的操作答案 1 :(得分:0)
我不确定您提到的两种方法是否提供了相同的功能:您使用performBlock
在接收方管理对象上下文的步骤中执行随机代码。并使用mergeChangesFromContextDidSaveNotification
从另一个上下文保存处理NSNotification
。如果我直到这里,你唯一选择的是后者。
您可以在NSOperation
内创建子上下文,子上下文中保存的数据会自动传播到父上下文中。
进一步详细说明,您将使用performBlock
从后台修改父对象的托管对象 - 它基本上会将您调度到托管对象上下文的线程,以允许以安全的方式执行操作
答案 2 :(得分:0)
在我的问题上搜索答案时,我找到了Concurrent Core Data Stacks Performance条。本文回答说,如果您使用mergeChangesFromContextDidSaveNotification
方法使用包含同步数据的旧核心数据堆栈,则可以获得更好的性能。
我还发现了苹果示例ThreadedCoreData。在此示例中,他们仍然使用mergeChangesFromContextDidSaveNotification
同步。
所以回答我的问题是,如果你继续表现,你应该使用mergeChangesFromContextDidSaveNotification
,如果你更简单的实现你应该使用嵌套的上下文。