Iphone 删除UITableViewCell时显示进度HUD

Iphone 删除UITableViewCell时显示进度HUD,iphone,ios,objective-c,cocoa-touch,Iphone,Ios,Objective C,Cocoa Touch,我试图在显示进度HUD(在本例中为MBProgressHUD)时删除UITableViewCell。这是必要的,因为要删除的核心数据实体相对较大。运行此代码时,会收到以下错误消息: 由于未捕获异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:节0中的行数无效。”。更新(2)后现有节中包含的行数必须等于更新(2)前该节中包含的行数,加上或减去从该节中插入或删除的行数(0插入,1删除),加上或减去移入或移出该节的行数(0移入,0移出).' 正在

我试图在显示进度HUD(在本例中为MBProgressHUD)时删除
UITableViewCell
。这是必要的,因为要删除的核心数据实体相对较大。运行此代码时,会收到以下错误消息:

由于未捕获异常“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出现,然后应用程序继续挂起。
我确信这与我的多任务处理结构有关。

managedObjectContext不是线程安全的。您需要为每个线程创建它。

当您第一次调用
dispatch\u async
时,您正在分离该线程并允许该方法继续执行。这意味着
[self.tableView endUpdates]


相反,您可以调用
[self.tableView beginUpdates]
[self.tableView endUpdates]dispatch\u async
的第二次调用中执行code>。

但是如果
managedObjectContext
是一个实例变量(在本例中是),这是否适用?是。每个线程都必须有自己的NSManagedObjectContext实例。