CoreData在一个单独的线程中

时间:2011-12-01 15:07:55

标签: xcode multithreading cocoa core-data thread-safety

我想要的是:

  • 在不阻塞主线程的情况下运行的核心数据
  • 有关系的实体
  • InterfaceBuilder中的
  • 绑定

我尝试了'一切',但事实证明,Core Data在两个或多个线程和两个NSManagedObjectContexts以及绑定和具有关系的实体等方面存在太多困难。这些线程可以使CoreData非常复杂。

尽管如此,我想使用Core Data,我希望它能在后台运行以获得良好的UI响应。

所以我想知道,是否可以在一个单独的线程中完全运行与Core Data相关的所有内容,这不是主线程?

如果我终于找到一个有效的解决方案,我会给大家50块钱......

2 个答案:

答案 0 :(得分:1)

我使用两个NSManagedObjectContext实例将一些持续时间较长的数据任务推送到另一个使用Grand Central Dispatch的线程上。

只要您小心将此上下文与用于获取数据的主线程上的上下文合并,那么您应该能够以这种方式获得一些性能。

答案 1 :(得分:0)

我不确定这是否可以帮助您,但也许您可以创建一个新的NSOperationQueue并在后台添加您需要的任何核心数据功能。因此,在您的类中有一个属性为NSOperationQueue,然后在-viewDidLoad方法中创建一个新属性: myOperationQueue = [NSOperationQueue new];每当你想要做一个操作,你可以将它添加到队列中,我相信它将在一个单独的线程上执行(self.myOperationQueue addOperation:someFunction),如果你想与主线程交互,那么调用assert([NSThread] isMainThread])在方法调用的开头。我以不同的方式使用Core Data和线程,但是从第二个线程我可以创建一个创建NSManagedObject的临时对象。