2013-03-31 64 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當你重新進入主線程。