【问题标题】:Why NSManagedObject instances should never be passed from one thread to another?为什么 NSManagedObject 实例永远不应该从一个线程传递到另一个线程?
【发布时间】:2018-06-09 22:28:24
【问题描述】:

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

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】:

    Core Data 不是线程安全的。差不多就这些了。

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 2020-11-14
      • 2015-06-12
      • 2016-09-09
      • 2013-04-21
      相关资源
      最近更新 更多