2

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

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

在这里阅读了一下,我得到了这个代码:

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

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

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

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

4

2 回答 2

5

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

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

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

于 2013-03-21T17:07:05.347 回答
0

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

if ( [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:0 URL:storeUrl options:options error:&error] ) {
    managedObjectContextForThread = [[NSManagedObjectContext alloc] init];
    [managedObjectContextForThread setPersistentStoreCoordinator:coordinator];
}
else {
// investigate 'error'
}
于 2013-03-21T17:04:35.060 回答