0

を使用していくつかの作業を実行し、NSBlockOperationこのブロック内で永続ストアが永続ストアを失います。

次のコード:

- (void) eraseCoreData_ManagedObjectsInArray:(NSArray *) arrayOfManagedObjectsToDelete usingManagedContext:(NSManagedObjectContext *) managedObjectContext
{
    NSLog(@"Managed object context is %@", managedObjectContext);
    NSLog(@"----->Persistent store of the deletion context has %d stores", [managedObjectContext.persistentStoreCoordinator.persistentStores count]);

    // add the operation to the queue with a block
    [self.coreDataDeletionQueue addOperationWithBlock:^{

    for (NSManagedObject *objectToDelete in arrayOfManagedObjectsToDelete) {
        [managedObjectContext deleteObject:objectToDelete];
    }

    NSLog(@"Managed object context in operation block is %@", managedObjectContext);
    NSLog(@"Persistence store coordinator in operation block is %@", managedObjectContext.persistentStoreCoordinator);
    NSLog(@"Persistent store of the deletion context in operation block has %d stores", [managedObjectContext.persistentStoreCoordinator.persistentStores count]);

    NSError *saveError = nil;
    if (![managedObjectContext save:&saveError]) {
        NSLog(@"Couldn't save Core-Data state for the deleted objects result: %@", [saveError localizedDescription]);
    }
    }];
}

これをログアウトします:

管理対象オブジェクトのコンテキストは < NSManagedObjectContext: 0xa46ff10 > です

----->削除コンテキストの永続ストアには 1 つのストアがあります

操作ブロックの管理オブジェクト コンテキストは < NSManagedObjectContext: 0xa46ff10 > です

オペレーション ブロックの永続ストア コーディネーターは < NSPersistentStoreCoordinator: 0xa1a45e0 > です。

操作ブロックの削除コンテキストの永続ストアにストアがありません

*キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: 'この NSPersistentStoreCoordinator には永続的なストアがありません。保存操作を実行できません。

このストアの突然の喪失の理由はわかりません。これは、メモリ内ストアを使用するように設定したテスト スイートで実行されておりNSOperationQueue、ブロックを実行するこれとメモリが共有されていないためでしょうか?

4

1 に答える 1

1

コードを間違った方法で使用していると思います。

まず、各スレッドには独自のコンテキストが必要です。したがって、ブロック操作内で新しいコンテキストを作成し、そのブロック内で使用する必要があります。

NSManagedObjectContext *blockContext = [[NSManagedObjectContext alloc] init];
[blockContext setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]];

次に、コンテキスト内でオブジェクトを共有する必要がある場合は、NSManagedObjectIDand notを使用しNSManagedObjectます。そのブロックを作成する前にメイン コンテキストを保存しないと、一時的な ID しかありません。それ以外の場合は- (BOOL)obtainPermanentIDsForObjects:(NSArray *)objects error:(NSError **)error、保存せずに永続的な ID を取得するために使用します。

NSArray *objectIDs = [arrayOfManagedObjectsToDelete valueForKey:@"objectID"];

ブロック内で を使用- (NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID error:(NSError **)errorして、関心のあるオブジェクトを取得しますblockContext

あなたのコードは次のようになります

NSArray *objectIDs = [arrayOfManagedObjectsToDelete valueForKey:@"objectID"];

// add the operation to the queue with a block
[self.coreDataDeletionQueue addOperationWithBlock:^{

    NSManagedObjectContext *blockContext = [[NSManagedObjectContext alloc] init];
    [blockContext setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]];

    NSError* error = nil;
    for (NSManagedObject *objectID in objectIDs) {
        // some error handling here...
        NSManagedObject* objectToDelete = [existingObjectWithID:objectID error:&error];
        [blockContext deleteObject:objectToDelete];
    }

    if (![blockContext save:&error]) {
        NSLog(@"Couldn't save Core-Data state for the deleted objects result: %@", [error localizedDescription]);
    }
}];
于 2013-01-10T14:03:07.077 に答える