在我的应用中,我NSFetchedResultsController
会在数据库的每次更改中更新我的表格。
在更改过程中某些时候应用程序出现问题,无论我做什么,表都保持空白(即使我更改了屏幕并返回,表仍为空)。
只有在关闭应用程序并将其重新打开后,所有内容似乎再次正常。
我将问题隔离到此错误
“CoreData:错误:严重的应用程序错误。捕获到异常 在调用期间来自NSFetchedResultsController的委托 -controllerDidChangeContent :.无效更新:第0部分中的行数无效。现有部分中包含的行数 更新后(19)必须等于包含的行数 更新前的那一节(19),加上或减去行数 从该部分插入或删除(3个插入,0个删除)和加号 或减去移入或移出该部分的行数(0移动 in,0搬出去了)。 with userInfo(null)“
这似乎与“开始更新”和“结束更新”中的行号之间的解释性差异有关,这意味着在删除或插入行时出现错误。
使用断点很难调试,因为事情并非经常发生。
有什么建议吗?
我的代码:
#pragma mark - NSFetchedResultsControllerDelegate
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
[self.guiTableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
switch(type) {
case NSFetchedResultsChangeInsert:
[self.guiTableView beginUpdates];
[self.guiTableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.guiTableView endUpdates];
break;
case NSFetchedResultsChangeDelete:
[self.guiTableView beginUpdates];
[self.guiTableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationLeft];
[self.guiTableView endUpdates];
// if (controller.sections.count==0) {
// [self alertAboutNothingInMyAssetsAndPop];
// }
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.guiTableView;
SOOptionCell *cell;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
break;
case NSFetchedResultsChangeUpdate:
cell = (SOOptionCell *)[tableView cellForRowAtIndexPath:indexPath];
[self configureCell:cell atIndexPath:indexPath animated:YES];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationAutomatic];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller{
[self.guiTableView endUpdates];
}
答案 0 :(得分:2)
首先,删除委托方法中的所有 - beginUpdates
和-endUpdates
调用。应该只有一个。 -beginUpdates
中的一个-controllerWillChangeContent:
和-endUpdates
中的一个-controllerDidChangeContent:
。我甚至会说你应该将其他方法改回Apple提供的示例,而不是自己编写。
一旦你这样做,差异就会消失吗?我怀疑它会。