在我正在处理的应用中,我需要同时访问和写入Core Data。我已经能够收集到这意味着我需要使用多个managedObjectContexts,但我不明白我应该如何设置这两个managedObjectContexts。
据我所知,一旦我进行了设置,我需要在其managedObjectContext上的后台线程上执行写操作,然后通过如下操作合并数据:Core Data and threads / Grand Central Dispatch。
所以我的问题是,我将如何启动两个单独的managedObjectContexts,以便我可以按照描述使用它们?
答案 0 :(得分:1)
您必须使用相同的NSManagedObjectContexts
创建两个单独的NSPersistentStoreCoordinator
,
首先在模型类中创建两个NSManagedObjectContexts
名称backgroundManagedObjectContext
和mainBackgroundManagedObjectContext
,如下所示
+ (NSManagedObjectContext *)backgroundManagedObjectContext
{
static NSManagedObjectContext * backgroundManagedObjectContext;
if(backgroundManagedObjectContext != nil){
return backgroundManagedObjectContext;
}
@try {
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
backgroundManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[backgroundManagedObjectContext setPersistentStoreCoordinator: [self persistentStoreCOordinator]];
}
}
@catch (NSException *exception) {
NSLog(@"Exception occur %@",exception);
}
return backgroundManagedObjectContext;
}
然后两者都需要得到相同的persistentStoreCoordinator
然后需要将您的backgroungManagedObjectContext
合并到mainBackgroundManagedObjectContext
,只要您将数据保存到NSNotification
,就可以创建backgroundManageObjectContext
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(contextDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:nil];
然后您必须实施此通知方法来更新mainManagedObjectContext
这样的
- (void)contextDidSave:(NSNotification *)notification
{
SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
[[self mainManagedObjectContext] performSelectorOnMainThread:selector withObject:notification waitUntilDone:YES];
}
答案 1 :(得分:0)
如果你真的想要进行并发读写,你可能会对WWDC 2013期间提供的设置感兴趣。它使用两个NSPersistentStoreCoordinator
,每个都有一个上下文。您可以手动合并它们之间的更改,从而实现漂亮的非UI阻止代码。
以下会话对此进行了描述: