又一个 NSInternalInconsistencyException,但使用 NSFetchedResultsController
Posted
技术标签:
【中文标题】又一个 NSInternalInconsistencyException,但使用 NSFetchedResultsController【英文标题】:Yet another NSInternalInconsistencyException, but using NSFetchedResultsController 【发布时间】:2013-07-16 07:13:26 【问题描述】:我已经处理了许多与 NSInternalInconsistencyException / NSFetchedResultsController 相关的问题/答案,但我找不到任何可以帮助我解决问题的方法。
在我的 TVC 中删除一行后出现此错误:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效
这是负责对数据源执行删除的方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
if (editingStyle == UITableViewCellEditingStyleDelete)
[self.tableView beginUpdates];
Role *roleToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSLog(@"Deleting: %@", roleToDelete.name);
[self.managedObjectContext deleteObject:roleToDelete];
[self.managedObjectContext save:nil];
// Delete the row from the data source
// [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self performFetch];
[self.tableView endUpdates];
我的异常断点停在这个方法的最后一行。奇怪的是调试器说我要删除两行,而我不是:
更新后现有节中包含的行数 (1) 必须等于该节中包含的行数 在更新 (2) 之前,加上或减去插入的行数或 从该部分删除(插入 0 个,删除 2 个)
下次启动应用时,很明显只删除了一行。
以下是可能导致问题的其他方法:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return [[self.fetchedResultsController sections] count];
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
【问题讨论】:
我认为 self.fetchedResultsController 是您的本地数组,您不会从中删除数据。您已将其从 self.fetchedResultsController 中删除。 @fibnochi:self.fetchedResultsController
是 NSFetchedResultsController
而不是数组。
【参考方案1】:
获取结果控制器 (FRC) 自动更新表视图,如果一个对象 被插入、删除或更改。所以, 你只需要删除对象:
Role *roleToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
[self.managedObjectContext deleteObject:roleToDelete];
[self.managedObjectContext save:nil];
其他所有内容(beginUpdates
、deleteRowsAtIndexPaths:...
、endUpdates
)
在 FRC 委托方法中完成(controllerWillChangeContent:
、didChangeObject:...
、
controllerDidChangeContent:
)。也不需要拨打performFetch
。
在您的情况下,deleteRowsAtIndexPaths:...
被调用两次:一次在您的 commitEditingStyle:
方法中,第二次在 FRC 委托方法 didChangeObject:...
中。这会导致“内部不一致异常”。
【讨论】:
这是一个简单的解决方案。感谢您的帮助,这不是您第一次提供它:)以上是关于又一个 NSInternalInconsistencyException,但使用 NSFetchedResultsController的主要内容,如果未能解决你的问题,请参考以下文章