我在表視圖中使用核心數據模型時遇到問題。在表視圖的commitEditingStyle:委託方法我先刪除該模型的對象,然後將相應的行表視圖,與此類似:核心數據:什麼時候是deleteObject:完成?
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
[self.managedObjectContext deleteObject:[self coreDataObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
}
}
但是,這引發了一個NSInternalInconsistencyException在UITableView的,因爲numberOfRowsInSection:委託方法返回由於核心數據對象尚未被刪除,所以錯誤的行數。
我該如何解決這種「官方方式」?或者最好的方法?
我一定要跟蹤NSManagedObjectContextObjectsDidChangeNotification通知,並等待相應的刪除通知?這是可行的,但可以quiclky變得相當混亂。
我只是等待,希望它在一段時間後被刪除?我測試過插入[self performSelector:withObject:afterDelay:]來延遲刪除表視圖行。即使延遲爲0.0,它也可以工作。我假定Core Data框架在當前運行循環完成後刪除對象,但這是有保證的嗎?它可能只是純粹的巧合。
處理這種情況的方法有哪些?對於像deleteObject:withCompletionHandler:這樣的塊完成API來說會更好。
任何想法?
/帕爾
不幸的是,我沒有使用FetchedResultController。這是一個iPad應用程序,我不得不使用普通的UITableView。核心數據對象之前已經被獲取。 –
那麼慣例是使用'FetchedResultsConttroller'來響應'UITableView'中的對象變化。從文檔:「NSFetchedResultsController的一個實例使用此協議中的方法來通知其委託,由於添加,刪除,移動或更新操作,控制器的提取結果已更改。」 – dombesz
非常方便!但在這種情況下它並不能幫助我。 –