0

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

UIManagedDocument的 managedObjectContext 确实有这个,但我不知道如何在不使用UIManagedDocument.

这是我正在使用的代码,其结果是managedObjectContextparentContext属性为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;
}
4

2 回答 2

1

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

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

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

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

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

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

于 2013-03-15T17:03:45.923 回答
1

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

[newContext setParentContext:mainThreadManagedObjectContext];

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

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

于 2013-03-15T16:25:42.160 回答