1

NSMainQueueConcurrencyType のメイン管理オブジェクト コンテキストを持つ Core Data スタックがあります。

ユーザーは、時間がかかる可能性がある管理オブジェクトでタスクを開始できるため、別のコンテキストで実行されます。

NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setParentContext:mainMOC];
Person *samePerson = (Person *)[context objectWithID:person.objectID];
[context performBlock:^{
    // BLOCK 1
    // do lots of work

    // then update the managed object
    samePerson.value = someCalculatedValue;

    // save the private context
    NSError *error;
    if (![context save:&error]) {
        NSLog(@"Error: %@", error);
    }

    [mainMOC performBlock:^{
        NSError *error;
        if (![mainMOC save:&error]) {
            NSLog(@"Error saving: %@", error);
        }
    }];
}];

これは正常に動作し、メインの MOC が適切に更新され、NSFetchedResultsController が適切に機能するように接続されます。

問題は削除です。オブジェクトを削除するには、次の設定があります。

NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setParentContext:mainMOC];
[context performBlock:^{
    // BLOCK 2
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
    NSError *error;
    NSArray *all = [context executeFetchRequest:request error:&error];
    if (!all) {
        NSLog(@"Error fetching: %@", error);
    } else {
        for (NSManagedObject *person in all) {
            [context deleteObject:person];
        }
        NSError *error;
        if (![context save:&error]) {
            NSLog(@"Error saving: %@", error);
        }

        [mainMOC performBlock:^{
            NSError *error;
            if (![mainMOC save:&error]) {
                NSLog(@"Error saving: %@", error);
            }
        }];
    }
}];

この削除操作(ブロック 2) を長時間のタスク(ブロック 1) の実行中に実行すると、削除操作はすぐに終了し、メイン コンテキストに保存されます。しばらくしてブロック 1 が終了し、最後に mainMOC を保存すると、一見明らかなクラッシュが発生します。

CoreData could not fulfill a fault for ...

私の質問は、オブジェクトが削除される可能性があるブロック 1 などのタスクを実行するにはどうすればよいですか?

4

1 に答える 1