为什么 NSManagedObject 实例不应该从一个线程传递到另一个线程?

Why NSManagedObject instances should never be passed from one thread to another?

我正在学习如何使用多个托管对象上下文,并且正在练习中

let childContext =
NSManagedObjectContext(
concurrencyType: .mainQueueConcurrencyType)
childContext.parent = coreDataStack.mainContext

let childEntry =
childContext.object(with: surfJournalEntry.objectID)
as? JournalEntry

detailViewController.journalEntry = childEntry
detailViewController.context = childContext
detailViewController.delegate = self

i 运行 变成这些话:

You must use object(with:) to retrieve the journal entry because managed objects are specific to the context that created them.

我被卡住了,因为我不明白为什么严格禁止将您从一个 MOC 获得的托管对象传递给另一个。如果有人知道为什么请分解一下好吗?

核心数据不是线程安全的。差不多就这些了。

如果您在多个线程上使用对象或方法并且它们不是线程安全的,那么您正在制造一场灾难。损坏的数据和应用程序崩溃很常见。更糟糕的是,它们可能不会一直发生,或者可能针对不同的用户在不同的时间发生。任何多线程代码都是如此,而不仅仅是 Core Data。

但这不是该消息告诉您的内容。它说“...托管对象特定于创建它们的上下文。”那是完全不同的事情。

当您获取托管对象时,您使用托管对象上下文来执行此操作。上下文是托管对象和底层持久存储文件之间的 link。如果您尝试将托管对象与其他上下文一起使用,则该上下文对它一无所知。它不能以任何方式使用该对象。很难从您的代码中判断这是哪里发生的,但这就是消息的意思。