为什么永远不应该将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实例从一个线程传递到另一个线程?的主要内容,如果未能解决你的问题,请参考以下文章