Objective c 核心数据在NSOperation和sync中插入对象

Objective c 核心数据在NSOperation和sync中插入对象,objective-c,core-data,concurrency,nsoperation,Objective C,Core Data,Concurrency,Nsoperation,我正在NSOperation中从网络响应保存对象。据我所知,对于合并MOC从后台线程到主线程的更改,我可以使用父上下文的mergeChangesFromContextDidSaveNotification或performBlock 我更喜欢使用来自ContextDidSaveNotification的合并更改或性能锁? 每种合并方法的优缺点是什么 NSOperation在后台上下文中执行。因此,当我调用performBlock时,是否会创建新线程?我不确定您提到的两种方法是否提供了等效的功能:您

我正在
NSOperation
中从网络响应保存对象。据我所知,对于合并MOC从后台线程到主线程的更改,我可以使用父上下文的
mergeChangesFromContextDidSaveNotification
performBlock

我更喜欢使用来自ContextDidSaveNotification的
合并更改
性能锁
? 每种合并方法的优缺点是什么


NSOperation
在后台上下文中执行。因此,当我调用
performBlock
时,是否会创建新线程?

我不确定您提到的两种方法是否提供了等效的功能:您使用
performBlock
在接收方管理的对象上下文的踏板上执行随机代码。您可以使用
mergeChangesFromContextDidSaveNotification
从另一个上下文保存中处理
NSNotification
。如果我说的没错,你只能选择后者

您可以在
NSOperation
中创建子上下文,子上下文中保存的数据会自动传播到父上下文中


为了进一步说明,您将使用
performBlock
从后台修改父对象的托管对象-它基本上将您分派到托管对象上下文的线程,以允许以安全的方式执行操作

答案在很大程度上取决于您的后台MOC是否将主MOC作为父对象

如果您使用的是具有专用/主队列并发性的MOC,则只需使用
performBlock

如果是,要在相应的正确队列中执行命令,可以使用
performBlock

因此,即使您必须使用
mergeChanges
——而不必使用子上下文——您也可以将
mergeChanges
嵌套在
performBlock
中!但是您不必使用子上下文的原因是,您的“后台线程”MOC应该是主线程MOC的子线程。因此,您所要做的就是
保存
子项以将更改合并到父项中。(请注意,还需要保存父级)

回到问题上来:

  • mergeChanges
    如果您不是将更改从子MOC推送到父MOC,并在子MOC中保存
  • 如果您使用了具有不同并发类型的多个MOC,则在主线程的mainQueueMOC上的操作上使用
    performBlock

在搜索我的问题的答案时,我找到了这篇文章。本文回答说,如果使用
mergeChangesFromContextDidSaveNotification
方法使用旧的核心数据堆栈和同步数据,您将获得更好的性能。 我还找到了苹果的例子。在本例中,他们仍然使用sync with
mergeChangesFromContextDidSaveNotification


所以,我的问题的答案是,如果您继续执行性能,您应该使用
mergeChangesFromContextDidSaveNotification
如果您知道应该使用嵌套上下文的更简单的实现方式。

父子上下文提供了与
mergeChangesFromContextDidSaveNotification
等效的内容。父子上下文需要使用队列限制,因此
performBlock:
。所以这个问题是正确的。