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

Osc*_*mez 7 iphone core-data thread-safety nsmanagedobjectcontext ios

直接从NSManagedObjectContext 文档中我对以下段落感到困惑:

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

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

[privateContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
Run Code Online (Sandbox Code Playgroud)

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

 [myPrivateQueueOwnedManagedObject setTitle:@"My Title];
Run Code Online (Sandbox Code Playgroud)

也是线程安全吗?文档对此真的很模糊,但我的理解是,这不是线程安全是正确的吗?

在ManagedObjectContext中获取属性的getter如请求persistentStoreCoordinator属性会是线程安全的吗?我的理解是它不会.

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

Mar*_*rra 9

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

-setTitle:不是因为您在托管对象上调用setter .

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

-com.apple.CoreData.ConcurrencyDebug 1
Run Code Online (Sandbox Code Playgroud)

当你违反线程限制时,这将抛出一个断言.

更新

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

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