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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么永远不应该将NSManagedObject实例从一个线程传递到另一个线程?相关的知识,希望对你有一定的参考价值。

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

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

我碰到了这些话:

您必须使用object(with :)来检索日记条目,因为托管对象特定于创建它们的上下文。

我被困了,因为我无法理解为什么严格禁止将你从一个MOC传递到另一个MOC的托管对象。如果有人知道为什么你能打破它吗?

答案

核心数据不是线程安全的。这就是它。

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

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

获取托管对象时,可以使用托管对象上下文来执行此操作。上下文是托管对象与底层持久性存储文件之间的链接。如果您尝试将托管对象与其他上下文一起使用,则该上下文对此不了解任何内容。它不能以任何方式使用该对象。很难从代码中判断出这种情况发生了什么,但这就是消息的含义。

以上是关于为什么永远不应该将NSManagedObject实例从一个线程传递到另一个线程?的主要内容,如果未能解决你的问题,请参考以下文章

子类化一个 NSManagedObject 子类

NSManagedObject 的副本

为啥你永远不应该重新加载模块? [复制]

我应该总是/永远/从不将对象字段初始化为默认值吗?

为啥我的 NSManagedObject 不符合 KVC?

为啥我们在 NSManagedObject 中需要临时 ID