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

问题描述 投票:0回答:1

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

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的托管对象。如果有人知道为什么你能打破它吗?

ios multithreading core-data nsmanagedobject
1个回答
2
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.