2013-03-31 39 views
0

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

终止应用程序由于未捕获的异常“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出现,则该应用进行到挂起。我相信这与我的多任务结构有关。

回答

0

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

+0

但是,如果'managedObjectContext'是一个实例变量(在这种情况下)它会适用? – Andrew

+0

是的。每个线程都必须有自己的NSManagedObjectContext实例。 – Jeepston

0

当您第一次致电dispatch_async时,您将分离该线程并允许该方法继续执行。这意味着,[self.tableView endUpdates];正在[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

之前调用相反,把你的电话给[self.tableView beginUpdates];[self.tableView endUpdates];你的第二个电话里面dispatch_async当你重新进入主线程。