核心数据设置多个managedObjectContexts

时间:2013-10-01 04:11:31

标签: ios multithreading core-data nsmanagedobjectcontext

在我正在处理的应用中,我需要同时访问和写入Core Data。我已经能够收集到这意味着我需要使用多个managedObjectContexts,但我不明白我应该如何设置这两个managedObjectContexts。

据我所知,一旦我进行了设置,我需要在其managedObjectContext上的后台线程上执行写操作,然后通过如下操作合并数据:Core Data and threads / Grand Central Dispatch

所以我的问题是,我将如何启动两个单独的managedObjectContexts,以便我可以按照描述使用它们?

2 个答案:

答案 0 :(得分:1)

您必须使用相同的NSManagedObjectContexts创建两个单独的NSPersistentStoreCoordinator

首先在模型类中创建两个NSManagedObjectContexts名称backgroundManagedObjectContextmainBackgroundManagedObjectContext,如下所示

+ (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阻止代码。

以下会话对此进行了描述:

  • 207 - Core核心数据有什么新功能(从幻灯片编号145开始)。
  • 211 - 核心数据性能(从幻灯片编号91开始),