创建 NSManagedObjectContext 以在线程中使用

Posted

技术标签:

【中文标题】创建 NSManagedObjectContext 以在线程中使用【英文标题】:Creating NSManagedObjectContext for use in thread 【发布时间】:2013-03-21 16:56:08 【问题描述】:

我正在尝试创建一个新的 NSManagedObjectContext 实例,以便我可以在主线程之外的线程中执行获取请求。据我了解,每个线程都需要它自己的实例,尽管它们可以共享存储。

我的应用是基于核心数据文档的应用。

读了一点here 我得到了这个代码:

NSManagedObjectContext *managedObjectContextForThread = nil;
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];

if (coordinator != nil) 
    managedObjectContextForThread = [[NSManagedObjectContext alloc] init];
    [managedObjectContextForThread setPersistentStoreCoordinator:coordinator];
    [managedObjectContextForThread setUndoManager:nil];

它运行,但是当我执行 fetch 时没有得到任何结果,我怀疑是因为 NSPersistentStoreCoordinator 没有正确设置。

我应该如何设置该商店协调员以与我的主要商店合作?还是我在这里缺少其他东西?

【问题讨论】:

【参考方案1】:

Apple 的“通常推荐的方法”是在上下文之间共享一个持久存储协调器。理想情况下,您应该已经拥有对应用的主要托管对象上下文的引用,并使用该上下文的持久存储协调器。

NSManagedObjectContext *managedObjectContextForThread = [[NSManagedObjectContext alloc] init];;
[managedObjectContextForThread setPersistentStoreCoordinator:myMainContext.persistentStoreCoordinator];

看看 Apple 的 Core Data Programming Guide 中的“Concurrency With Core Data”

【讨论】:

一般来说,多个持久存储协调器没有任何问题。但是每个新的 PSC 都是一个全新的数据空间。您确实希望为每个逻辑数据存储使用一个单一的 PSC。但是我经常在同一个程序中有多个独立的Core Data堆栈,但它们之间没有任何关系。这里发布的代码是正确的,我只是对解释有一个小问题。 很公平。 Apple 的指南称,一个共享的 PSC 是“……通常推荐的方法”。所以我会相应地编辑我的答案。 啊,所以可以(安全)使用 MOC 在线程中获取它的 persistentStoreCoordinator? 非常感谢!花了太长时间试图避免做正确的事情:) 如果您不担心在 ios 4.x 上运行您的应用程序,您可能需要了解 iOS5 中引入的子 MOC 概念。根据您的情况,它们也可以使您的生活更轻松。查看这篇文章:cocoanetics.com/2012/07/multi-context-coredata【参考方案2】:

您必须将持久存储添加到存储协调器,然后将持久存储添加到托管对象上下文。

if ( [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:0 URL:storeUrl options:options error:&error] ) 
    managedObjectContextForThread = [[NSManagedObjectContext alloc] init];
    [managedObjectContextForThread setPersistentStoreCoordinator:coordinator];

else 
// investigate 'error'

【讨论】:

以上是关于创建 NSManagedObjectContext 以在线程中使用的主要内容,如果未能解决你的问题,请参考以下文章

创建 NSManagedObjectContext 以在线程中使用

ThreadedCoreData 示例(来自 Apple)是不是在主线程上创建 NSManagedObjectContext?

只能在使用队列创建的 NSManagedObjectContext 上使用 -performBlock:

在私有/后台队列上创建 NSManagedObjectContext:怎么办?

如何在多个线程上处理 NSManagedObjectContext 和 NSManagedObject 创建和编辑?

我需要从我创建的每个 NSManagedObjectContext 中观察 NSManagedObjectContextDidSaveNotification 吗?