9

私はこれにしばらく苦労しており、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];
                    });
                }
            }];
        }
    });
}
4

2 に答える 2