直接来自NSManagedObjectContext documentation的以下段落让我感到困惑:
基于队列的托管对象上下文的Setter方法是线程安全的。 您可以直接在任何线程上调用这些方法。
最大的问题是ManagedObjectContext上的setters方法,但不是在此上下文拥有的ManagedObjects中?还是两者兼而有之?特别是如果对于私有队列MOC对象是这样的:
[privateContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
无论执行此行的线程如何,都是线程安全的,但是会像:
[myPrivateQueueOwnedManagedObject setTitle:@"My Title];
也是线程安全吗?文档对此非常模糊,但我的理解是,这不是线程安全的吗?
ManagedObjectContext中属性的getter怎么样,比如要求persistentStoreCoordinator属性会是线程安全的吗?我的理解是它不会。
此外,我一直认为某些托管对象属性(如objectID)是线程安全的,不需要使用performBlock:或performBlockAndWait进行访问:托管对象上是否存在线程安全的其他任何属性?
答案 0 :(得分:9)
-setPersistentStoreCoordinator:
是线程安全的,因为它是托管对象上下文上的setter方法。
-setTitle:
不是因为您在托管对象上调用了一个setter。
您可以使用调试标志确认此行为:
-com.apple.CoreData.ConcurrencyDebug 1
当你违反线程限制时会抛出一个断言。
虽然我们只是为了确认文档的第二段,但是在主线程上访问主样式队列MOC对象是否可以安全地访问BOTH MOC和MO?我的理解是,例如,如果上下文是Main样式并且线程是主线程,setTitle就可以了。这是由于传统原因,线程限制afaik,并且在使用MO进行UI更新时也有很大的帮助。
如果上下文定义为主队列并且您在主队列(也就是UI线程,又称主线程)上,那么您可以直接访问所有内容而不需要-performBlock:
。您在上下文所属的线程上,因此您遵循线程限制规则。