所以我知道NSManagedObjects不是线程安全的,而且是managedObjectIDs,我们需要每个线程一个单独的managedObjectContext。但是最近我遇到了一个问题,当时我在后台做了一些核心数据更改(有一个单独的runloop线程)和performSelectorOnThread:方法有时根本没有在这个runloop线程上调用。事实证明,原因是我在做
[someObject.managedObjectContext save:&error]
在此runloop线程上,并在主线程上创建了“someObject”。但它偶尔会“挂起”runloop线程。所以问题是如果你试图在不同的线程中保存上下文会发生什么。我只是想寻求更深刻的理解,谢谢。
答案 0 :(得分:1)
核心数据使用线程(或序列化队列)限制来保护 托管对象和托管对象上下文(请参阅“与...并发” 核心数据“)。这样做的结果是上下文假设了 默认所有者是分配它的线程或队列 - 这是 由调用其init方法的线程确定。你不应该, 因此,在一个线程上初始化一个上下文然后将其传递给一个 不同的线程。相反,您应该传递对持久性的引用 存储协调器并使接收线程/队列创建一个新的 从中得出的背景。
答案 1 :(得分:0)
你会崩溃。也许它有时会工作,你不会在调试时看到崩溃,但你永远不应该这样做。对象上下文及其中的托管对象只应在创建它们的线程上使用。 Apple的文档对此非常清楚,并提供了许多示例,说明如何处理长时间运行(慢速提取或异步保存)的情况。您应该阅读有关使用Core Data进行线程处理的文档以获取更多信息。