Ios 使用NSO操作时的同级NSManagedObjectContext

Ios 使用NSO操作时的同级NSManagedObjectContext,ios,core-data,nsoperation,nsoperationqueue,magicalrecord,Ios,Core Data,Nsoperation,Nsoperationqueue,Magicalrecord,我在使用NSO操作的多线程应用程序中使用CoreData时遇到了一些问题。我通过MagicalRecord(2.0.3)使用嵌套的ManagedObjectContext,如下所示: Root Context (saves to disk) | Main Thread Context (for populating the UI) | Sub-Context(s) (used to add/edit/remove data) 我有一个NSOperationQueue来处理所有数据处理 在大多数

我在使用NSO操作的多线程应用程序中使用CoreData时遇到了一些问题。我通过MagicalRecord(2.0.3)使用嵌套的ManagedObjectContext,如下所示:

Root Context (saves to disk)
|
Main Thread Context (for populating the UI)
|
Sub-Context(s) (used to add/edit/remove data)
我有一个NSOperationQueue来处理所有数据处理

在大多数情况下,一切正常,我可以异步下载数据,然后将其提供给NSOperation,然后NSOperation将其写入其中一个子上下文。在操作结束时保存会将更改推送到主上下文,并更新UI。太好了

问题在于,如果子上下文删除实体并保存(将其推送到主上下文),则同级子上下文仍会认为它存在。因此,如果兄弟姐妹试图对实体进行故障处理并将其从其父级(主上下文)中拉出来,我会遇到崩溃

我有两个问题:

  • 我应该使用MOC通知将推送到主MOC的更改合并回它的其他子项吗?我听到了这一点,又一次撞车了
  • 我应该有多个子上下文吗?MOC应该与一个线程关联(MagicalRecord帮助我实现自动化),我有一个用于保存数据的NSOperationQueue,所以我不应该只有一个子上下文吗?我已经验证了有时我的保存是由不同的上下文执行的

如果有任何建议,我将不胜感激。谢谢。

您可以而且应该拥有多个子上下文。但是,我不确定上下文的经典“线程隔离模式”是否是您应该拥有的模型。当你说一个上下文应该属于一个特定的线程时,你就是这么做的。MagicalRecord 2.0x现在使用私有队列上下文,因此其行为会稍有不同。没有规则规定兄弟上下文需要保持同步。你得自己做。一个非常简单的解决方案是在正在保存的上下文上侦听“did save”通知,然后在另一个线程上重置或创建新上下文。您可以使用通知或MagicalRecord提供的黑色完成标记来完成此操作


希望这有帮助

我也在考虑重置,但很谨慎。我将试用它,看看它的性能如何,然后发回。谢谢终于开始尝试,调用“重置”修复了问题。