在删除UITableViewCell时显示进度HUD

时间:2013-03-31 17:43:43

标签: iphone ios objective-c cocoa-touch

我正在尝试删除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出现,然后应用程序继续挂起。 我确信这与我的多任务处理结构有关。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

第一次调用dispatch_async时,您将分离该线程并允许该方法继续执行。这意味着[self.tableView endUpdates];

之前正在调用[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

相反,当您重新进入主线索时,请将您的来电置于[self.tableView beginUpdates];[self.tableView endUpdates];第二次来电dispatch_async