当您尝试从其他线程保存managedObjectContext时会发生什么?

时间:2012-03-19 09:03:04

标签: iphone ios multithreading core-data

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

    [someObject.managedObjectContext save:&error]

在此runloop线程上,并在主线程上创建了“someObject”。但它偶尔会“挂起”runloop线程。所以问题是如果你试图在不同的线程中保存上下文会发生什么。我只是想寻求更深刻的理解,谢谢。

2 个答案:

答案 0 :(得分:1)

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

  

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

答案 1 :(得分:0)

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