【问题标题】:How to create a NSManagedObjectContext with a non nil parentContext?如何使用非 nil parentContext 创建 NSManagedObjectContext?
【发布时间】:2013-03-15 11:41:03
【问题描述】:

如何创建一个NSManagedObjectContext,它有一个在不同队列/线程上运行的非nil parentContext

UIManagedDocument 的 managedObjectContext 确实有这个,但我不知道如何在不使用 UIManagedDocument 的情况下复制它。

这是我正在使用的代码,它会生成一个managedObjectContext,其parentContext 属性是nil

-(NSManagedObjectContext *)context{

    if (_context == nil){
        _context = [[NSManagedObjectContext alloc] init];
        _context.persistentStoreCoordinator = self.storeCoordinator;
    }
    return _context;
}

-(NSPersistentStoreCoordinator *) storeCoordinator{
    if (_storeCoordinator == nil) {
        _storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.model];

        NSError *err = nil;
        if (![_storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                             configuration:nil
                                                       URL:self.dbURL
                                                   options:nil
                                                     error:&err ]) {

            NSLog(@"Error while adding a Store: %@", err);
            return nil;

        }
    }
    return _storeCoordinator;
}

-(NSManagedObjectModel *) model{

    if (_model == nil) {
        _model = [[NSManagedObjectModel alloc] initWithContentsOfURL:self.modelURL];
    }
    return _model;
}

【问题讨论】:

  • 我刚刚编辑了问题以添加一些代码。
  • 您可以将任何 NSManagedObjectContext 的父上下文设置为任何其他 NSManagedObjectContext。 mycontext.parent = parentContext;

标签: objective-c cocoa core-data nsmanagedobjectcontext uimanageddocument


【解决方案1】:

您只需分配子上下文并设置其父上下文即可创建子上下文:

NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] init];
[childContext setParentContext:[self managedObjectContext]];

持久存储协调器是从父上下文继承的,所以这就是创建子上下文所需的全部内容。 父上下文必须使用一种基于队列的并发类型。这意味着您上面创建上下文的代码必须更改为:

_context = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSMainQueueConcurrencyType];

还有NSPrivateQueueConcurrencyType。哪个更好取决于您应用的设计。

在不同的队列/线程上运行是另一回事。这从来都不是自动的。您的代码在您调用它的任何队列或线程上运行。 Core Data 的直接支持仅限于使用基于队列的并发类型之一——但是您需要确保使用 performBlock:performBlockAndWait: 以确保上下文的操作实际发生在正确的队列上。

【讨论】:

    【解决方案2】:

    创建NSManagedObjectContext 后,如果您需要将其作为子上下文,则必须分配父上下文。

    [newContext setParentContext:mainThreadManagedObjectContext];
    

    在这种情况下,您甚至不必分配持久存储。来自文档:

    您现在可以使用 setParentContext: 指定父托管对象上下文,而不是为托管对象上下文指定持久存储协调器。这意味着 fetch 和 save 操作由父上下文而不是协调器进行调解。

    【讨论】:

      猜你喜欢
      • 2012-08-29
      • 2011-04-05
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多