多线程核心数据 - persistentStoreCoordinator与parentContext

时间:2016-01-25 23:55:48

标签: ios multithreading swift core-data nsmanagedobjectcontext

我正在尝试解决因从多个线程访问相同NSManagedObjectContext而导致的问题。我在Apple docs中找到了以下内容:

let moc = … //Our primary context on the main queue

let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateMOC.parentContext = moc

privateMOC.performBlock {
    //...
}

这似乎是我所追求的。我还在tutorial中发现了一些非常相似的东西,它已针对iOS 9进行了更新:

let privateContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateContext.persistentStoreCoordinator = coreDataStack.context.persistentStoreCoordinator

privateContext.performBlock { () -> Void in
  //...
}

它们似乎都达到了相同的效果,但Apple doc的版本使用parentContext而不是直接使用persistantStoreCoordinator。这两种方法有什么区别?

1 个答案:

答案 0 :(得分:1)

使用parentContext。这是自iOS 5以来使用持久性存储协调器的方法的首选。

  

在OS X v10.7和iOS v5.0之前,父存储始终是持久存储协调器。在OS X v10.7及更高版本和iOS v5.0及更高版本中,父存储可以是另一个托管对象上下文。最终,上下文祖先的根必须是持久存储协调器。协调器提供托管对象模型,并将请求分派给包含数据的各种持久性存储。

在您的特定情况下:

  

如果上下文的父存储是另一个受管对象上下文,则获取和保存操作由父上下文而不是协调器调解。此模式有许多使用方案,包括:

     
      
  • 在第二个线程或队列上执行后台操作。
  •   

来源:NSManagedObjectContext类引用," Parent Store"。