0

UITableViewCell進行状況の HUD (この場合は MBProgressHUD) を表示しながら削除しようとしています。削除されるコア データ エンティティは比較的大きいため、これは必要です。このコードを実行すると、次のエラー メッセージが表示されます。

キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: '無効な更新: セクション 0 の行数が無効です。更新後の既存のセクションに含まれる行数 (2) は、それに含まれる行数と等しくなければなりません更新前のセクション (2)、そのセクションから挿入または削除された行数 (0 挿入、1 削除) をプラスまたはマイナスし、そのセクションに移動した行数またはそのセクションから移動した行数 (0 移動、0 移動)アウト)。'

実行されるコードは次のとおりです。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        [self.tableView beginUpdates];

        [SVProgressHUD showWithStatus:@"Deleting..." maskType:SVProgressHUDMaskTypeGradient];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            Garden *gardenToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
            NSLog(@"Deleting garden '%@'", gardenToDelete.gardenName);
            [self.managedObjectContext deleteObject:gardenToDelete];
            [self.managedObjectContext save:nil];

            dispatch_async(dispatch_get_main_queue(), ^{

                NSLog(@"Dismissing progress HUD");
                NSLog(@"delete animation");
                NSLog(@"deleting row");

                  [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                  NSLog(@"performFetch");
                  [self performFetch];
                  [SVProgressHUD dismiss];
                });


        });

        [self.tableView endUpdates];
    }   
}

実行すると、HUD が表示され、アプリがハングアップします。これは、私のマルチタスクの構造に関係していると確信しています。

4

2 に答える 2

0

managedObjectContext はスレッドセーフではありません。スレッドごとに作成する必要があります。

于 2013-03-31T17:49:39.540 に答える