2012-03-19 139 views
1

所以我知道NSManagedObjects不是线程安全managedObjectIDs是,我们需要每个线程单独managedObjectContext。但最近我有一个问题,当我在做后台的一些核心数据的变化(有这一个单独的runloop线程)和performSelectorOnThread:方法有时简单地不调用这个runloop线程。原来的原因是我在做会发生什么?

[someObject.managedObjectContext save:&error] 
这个runloop线和“someObject”

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

+2

尝试想像所有生命,因为你知道它瞬间停止,并且你体内的每个分子都以光速爆炸。 – rickster 2012-03-19 16:45:20

回答

1

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

核心数据使用线程(或序列化队列)约束,以保护 管理对象和管理对象上下文(请参阅“使用 核心数据并发性”)。这样做的结果是上下文假定默认所有者是分配它的线程或队列 - 这是由调用其init方法的线程决定的 。你不应该,因此 ,初始化一个线程上下文然后将它传递到 不同的线程。相反,您应该传递对持久存储协调器的引用,并让接收线程/队列创建一个新的从上面导出的上下文 。

0

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