ios - 核心数据设置多个 managedObjectContexts

标签 ios multithreading core-data nsmanagedobjectcontext

在我正在开发的应用程序中,我需要同时访问和写入核心数据。我已经能够收集到这意味着我需要使用多个 managedObjectContexts,但我不明白我应该如何设置这两个 managedObjectContexts。

我明白,一旦我设置好它们,我需要在其 managedObjectContext 的后台线程上执行写操作,然后通过这样的操作合并数据:Core Data and threads / Grand Central Dispatch .

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

最佳答案

你必须像这样使用相同的 NSPersistentStoreCoordinator 创建两个单独的 NSManagedObjectContexts

首先在你的模型类中创建两个 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];

    }

关于ios - 核心数据设置多个 managedObjectContexts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19107822/

相关文章:

java - 使用类的方法中断 Runnable

objective-c - 在核心数据中查找或创建对象的标准?

ios - 在 UITableView 中缓存 CoreData 对象以提高性能?

iOS 持久存储选项

iphone - 为动态属性赋值会导致崩溃

ios - 改变 LeveyPopListView 的起点

ios - XCTest 测试套件中的共享测试

ios - 通过标签区分一个 UIButton

java - 从 SwingWorker 线程获取结果后,具有特定 JRadioButton 的 JPanel 不会更新

c++ - 无法将元素添加到共享指针的线程安全锁定队列中