Core Data 并发队列风格 MOC getters 线程安全

Core Data concurrency queue style MOC getters thread safety

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

Setter methods on queue-based managed object contexts are thread-safe. You can invoke these methods directly on any thread.

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

[privateContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];

无论执行此行的线程如何,都将是线程安全的,但类似于:

 [myPrivateQueueOwnedManagedObject setTitle:@"My Title];

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

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

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

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

上的 setter 方法

-setTitle: 不是因为您在 托管对象 .

上调用 setter

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

-com.apple.CoreData.ConcurrencyDebug 1

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

更新

While we are at it just to confirm the second paragraph on the documentation, is it safe to access BOTH MOC and MO for main style queue MOC objects while on the main thread?. my understanding is that it is so for instance setTitle would be ok if the context was Main style and the thread was the main thread. This is for legacy reasons with thread confinement afaik, and also a great help when using the MO for UI updates.

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