iphone - 另一个 NSInternalInconsistencyException,但使用 NSFetchedResultsController

标签 iphone ios objective-c core-data

我已经查看了许多与 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];
    }
}

我的异常断点 在此方法的最后一行停止。奇怪的是,调试器说我要删除两行,但我没有:

The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (2), plus or minus the number of rows inserted or deleted from that section (0 inserted, 2 deleted)

下次我启动应用程序时,很明显只有一行被删除了。

以下是可能导致问题的其他方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [[self.fetchedResultsController sections] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
}

最佳答案

如果一个对象,获取的结果 Controller (FRC)会自动更新 TableView 被插入、删除或更改。所以, 你只需要删除对象:

Role *roleToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
[self.managedObjectContext deleteObject:roleToDelete];
[self.managedObjectContext save:nil];

其他所有内容(beginUpdatesdeleteRowsAtIndexPaths:...endUpdates) 在 FRC 委托(delegate)方法中完成(controllerWillChangeContent:, didChangeObject:..., controllerDidChangeContent:).也不必调用 performFetch

在您的情况下,deleteRowsAtIndexPaths:... 被调用两次:一次是在您的 commitEditingStyle: 方法中,第二次是在 FRC 委托(delegate)方法 didChangeObject: ...。这会导致“内部不一致异常”。

关于iphone - 另一个 NSInternalInconsistencyException,但使用 NSFetchedResultsController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17670259/

相关文章:

ios - 未捕获的异常 : Assertion failure in -[UIKeyboardTaskQueue waitUntilAllTasksAreFinished]

ios - 如何删除 UIPageViewController 上的无限滚动?

ios - 获取连接到 View 的所有 segues 的列表

iphone - NSMutableArray 已填充但数据以某种方式丢失

iphone - 像 Vimeo 这样的 iOS 原生应用程序如何将 cookie 设置到移动版 Safari?

ios - SWRevealViewController 中不存在后退按钮

ios - Unresolved 标识符 NavigationButton 错误

iphone - UIImagePickerController 媒体类型 kUTTypeMovie 运行时异常

ios - 处理零?在 UITableViewCell 中

ios - 替换 html 字符串中的特定单词