根据Concurrency with Core Data Guide,您不应将 NSManagedObjectContext 保存在后台线程中,因为应用程序可能会在保存完成之前退出,因为线程已分离。
如果我理解正确,这意味着这样的事情是不正确的
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSManagedObjectContext* tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[tempContext setParentContext:[[MyDataManager sharedInstance] mainContext];
[tempContext performBlockAndWait:^{
//Do some processing
NSError* error;
[tempContext save:&error];
}];
});
我的第一直觉是在主队列完成后将上下文保存在主队列中,但 managedObjectContexts 应该是线程安全的。以下是可以解决问题还是有更好的解决方案?
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSManagedObjectContext* tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[tempContext setParentContext:[[MyDataManager sharedInstance] mainContext];
[tempContext performBlockAndWait:^{
//Do some processing
}];
dispatch_async(dispatch_get_main_queue(), ^{
[tempContext performBlockAndWait:^{
NSError* error;
[tempContext save:&error];
}];
});
});