У меня проблема с использованием базовой модели данных в табличном представлении.В методе commitEditingStyle: делегат табличного представления я сначала удаляю объект модели, а затем соответствующую строку в табличном представлении, аналогично следующему:
- (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, поскольку числоOfRowsInSection: делегатМетод возвращает неправильное количество строк, так как объект Core Data еще не был удален.
Как мне исправить это "официальным способом"?Или лучший способ?
Нужно ли отслеживать уведомление NSManagedObjectContextObjectsDidChangeNotification и ждать соответствующего уведомления об удалении?Это выполнимо, но может быстро стать немного грязным.
Я просто подожду и надеюсь, что это будет удалено через некоторое время?Я протестировал вставку [self executeSelector: withObject: afterDelay:], чтобы отложить удаление строки табличного представления.И это работает даже с задержкой 0,0.Я предполагаю, что инфраструктура Core Data удаляет объект после завершения текущего цикла выполнения, но гарантируется ли это?С таким же успехом это может быть просто совпадение.
Есть ли другой способ справиться с ситуацией?Было бы неплохо с API завершения блока, как deleteObject: withCompletionHandler:.
Есть идеи?
/ Påhl