【问题标题】:What happens when you try to save managedObjectContext from a different thread?当您尝试从不同的线程保存 managedObjectContext 时会发生什么?
【发布时间】:2012-03-19 09:03:04
【问题描述】:

所以我知道 NSManagedObjects 不是线程安全的,而 managedObjectIDs 是,我们需要每个线程单独的 managedObjectContext。但是最近我在后台进行一些核心数据更改时遇到了一个问题(为此有一个单独的 runloop 线程),并且 performSelectorOnThread: 方法有时根本没有在这个 runloop 线程上调用。原来是因为我在做

    [someObject.managedObjectContext save:&error]

在这个 runloop 线程上,并且在主线程上创建了“someObject”。但它只会偶尔“挂起”runloop线程。所以问题是如果您尝试将上下文保存在不同的线程中,会发生什么。我只是在寻求更深入的了解,谢谢。

【问题讨论】:

  • 试着想象你所知道的所有生命瞬间停止,你体内的每个分子都以光速爆炸。

标签: iphone ios multithreading core-data


【解决方案1】:

来自https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html

Core Data 使用线程(或序列化队列)限制来保护 托管对象和托管对象上下文(请参阅“与 核心数据”)。这样做的结果是上下文假设 默认所有者是分配它的线程或队列——这是 由调用其 init 方法的线程决定。你不应该, 因此,在一个线程上初始化一个上下文,然后将它传递给一个 不同的线程。相反,您应该传递对持久性的引用 存储协调器并让接收线程/队列创建一个新的 从中派生的上下文。

【讨论】:

    【解决方案2】:

    你会崩溃的。也许它有时会起作用,并且您在调试时不会看到崩溃,但您永远不应该这样做。对象上下文和其中的托管对象只能在创建它们的线程上使用。 Apple 的文档对此非常清楚,并提供了许多示例来说明如何处理可能需要长时间运行的操作(慢速获取或异步保存)的情况。您应该阅读有关使用 Core Data 进行线程化的文档以了解更多信息。

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 2011-11-03
      • 2016-11-29
      • 2016-07-23
      • 2017-02-14
      • 2011-05-06
      相关资源
      最近更新 更多