核心数据并发队列样式MOC getter线程安全

时间:2015-06-16 18:54:47

标签: ios iphone core-data thread-safety nsmanagedobjectcontext

直接来自NSManagedObjectContext documentation的以下段落让我感到困惑:

  

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

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

[privateContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];

无论执行此行的线程如何,都是线程安全的,但是会像:

 [myPrivateQueueOwnedManagedObject setTitle:@"My Title];

也是线程安全吗?文档对此非常模糊,但我的理解是,这不是线程安全的吗?

ManagedObjectContext中属性的getter怎么样,比如要求persistentStoreCoordinator属性会是线程安全的吗?我的理解是它不会。

此外,我一直认为某些托管对象属性(如objectID)是线程安全的,不需要使用performBlock:或performBlockAndWait进行访问:托管对象上是否存在线程安全的其他任何属性?

1 个答案:

答案 0 :(得分:9)

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

-setTitle:不是因为您在托管对象上调用了一个setter。

您可以使用调试标志确认此行为:

-com.apple.CoreData.ConcurrencyDebug 1

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

更新

  

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

如果上下文定义为主队列并且您在主队列(也就是UI线程,又称主线程)上,那么您可以直接访问所有内容而不需要-performBlock:。您在上下文所属的线程上,因此您遵循线程限制规则。