私はこれにしばらく苦労しており、Apple のドキュメントと SO はこれまでのところ役に立ちませんでした。UIManagedDocument で ManagedObjectContext を使用していましたが、以下のコードは正常に機能しました。次に、AppDelegate の CoreData に Apple のテンプレートを使用することにしたので、モデル、永続ストア コーディネーター、およびコンテキストが AppDelegate で作成されます。AppDelegate のコンテキストでの取得は問題ありませんが、バックグラウンドでの保存が問題になります。保存しているスレッドにローカルコンテキストが必要であり、Apple に従って同じ永続ストアコーディネーターを持つ必要があります。ただし、以下のコードは実際にはデータを保存しません。ここで誰かアドバイスしてもらえますか?ありがとうございました。
- (void)fetchAndPersist
{
dispatch_queue_t ffetchQ = dispatch_queue_create("ForFetch", NULL);
dispatch_async(ffetchQ, ^{
NSManagedObjectContext *secureManagedObjectContext;
NSPersistentStoreCoordinator *coordinator = [appDelegate persistentStoreCoordinator];
if (coordinator != nil) {
secureManagedObjectContext = [[NSManagedObjectContext alloc] init];
[secureManagedObjectContext setPersistentStoreCoordinator:coordinator];
}
// find missing date
DataManager *dataManager = [[DataManager alloc] init];
NSDate *missingDate = [dataManager findMissingDateFromDate:selectedDate inContext:secureManagedObjectContext];
if (missingDate) {
// fetch and parse data
DataFetcher *dataFetcher = [[dataFetcher alloc] init];
NSDictionary *fetchResponse = [dataFetcher parseDataForDate:missingDate];
// persist it in a block and wait for it
[secureManagedObjectContext performBlock:^{
DataStore *dataStore = [[DataStore alloc] init];
BOOL parsingError = [dataStore persistData:fetchResponse inContext:secureManagedObjectContext];
if (parsingError) {
// handle error
} else {
dispatch_async(dispatch_get_main_queue(), ^{
// perform on main
[self fetchAndPersist];
});
}
}];
}
});
}