核心数据并发队列风格MOC获取者线程安全

我直接从NSManagedObjectContext 文档直接感到困惑。

基于队列的托pipe对象上下文的setter方法是线程安全的。 你可以直接在任何线程上调用这些方法。

最大的问题是在ManagedObjectContext上的setter方法,而不是在这个上下文所拥有的ManagedObjects中。 还是两者兼而有之? 特别是如果对于私人队列MOC对象这样的话:

[privateContext setPersistentStoreCoordinator:self.persistentStoreCoordinator]; 

线程安全无论执行这个线程的线程,但会像这样:

  [myPrivateQueueOwnedManagedObject setTitle:@"My Title]; 

也是线程安全?,这个文档确实含糊不清,但我的理解是,这不会是线程安全的是正确的吗?

如何获取ManagedObjectContext中的属性(如询问persistentStoreCoordinator属性)是否是线程安全的? 我的理解是,它不会。

另外,一直以来我的理解是某些Managed Object属性(如objectID)是线程安全的,不需要使用performBlock:或performBlockAndWait来访问:受pipe对象上是否存在线程安全的其他任何属性?

-setPersistentStoreCoordinator:是线程安全的,因为它是托pipe对象上下文中的setter方法。

-setTitle:不是因为您正在调用托pipe对象上的setter。

您可以使用debugging标志来确认此行为:

 -com.apple.CoreData.ConcurrencyDebug 1 

当你违反线程限制时,会抛出一个断言。

更新

虽然我们只是为了确认文档的第二段,但是在主线程中访问主样式队列MOC对象时是否可以安全地访问MOC和MO? 我的理解是,它是这样的,例如setTitle会好,如果上下文是主风格和线程是主线程。 这是由于传统的原因与线程限制afaik,也是使用MO更新UI时的一个很大的帮助。

如果上下文被定义为主队列,并且你在主队列(又名UI线程,又名主线程)上,那么你可以直接访问所有的东西而不需要-performBlock: 您处于上下文所属的线程中,因此您遵循线程限制规则。