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];
}];
});
私の最初の本能は、終了時にコンテキストをメイン キューに保存することですが、managedObjectContext はスレッド セーフであるはずです。次は問題を解決するものですか、それともより良い解決策がありますか?
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];
}];
});
});