CoreData 在一个单独的线程中

Posted

技术标签:

【中文标题】CoreData 在一个单独的线程中【英文标题】:CoreData in one single separate thread 【发布时间】:2011-12-01 15:07:54 【问题描述】:

简而言之,我想要的是:

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

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

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

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

如果我最终找到可行的解决方案,我会给每个人 50 美元...

【问题讨论】:

我可以建议看看NSOperation 不完全确定,但任何与 UI 相关的内容(以及因此在 Interface Builder 中的绑定)都应该在主线程 iirc 中。因此,至少要做好一些线程间通信的准备。 @Monolo:我知道,我会在这里。 :( 【参考方案1】:

我使用两个 NSManagedObjectContext 实例将一些更持久的数据任务推送到具有 Grand Central Dispatch 的另一个线程。

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

【讨论】:

阅读了两个小时,这似乎是唯一的选择。我现在要做的是从头开始创建一个小型测试应用程序。我会针对即将到来的困难提出一个新问题... 这是我的第一个问题:***.com/questions/8346455/… :)【参考方案2】:

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

【讨论】:

以上是关于CoreData 在一个单独的线程中的主要内容,如果未能解决你的问题,请参考以下文章

将 CoreData 与对象一起使用?

NSManagedObject:在单独的线程上创建

可以在单独的线程中使用 NSFetchedResultsController 来加载 TableViewCells 吗?

Cocoa:CoreData - ManagedObjectContext 中的多个实体

后台核心数据

应用程序冻结 CoreData 保存