又一个 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.fetchedResultsControllerNSFetchedResultsController 而不是数组。 【参考方案1】:

获取结果控制器 (FRC) 自动更新表视图,如果一个对象 被插入、删除或更改。所以, 你只需要删除对象:

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

其他所有内容(beginUpdatesdeleteRowsAtIndexPaths:...endUpdates) 在 FRC 委托方法中完成(controllerWillChangeContent:didChangeObject:...controllerDidChangeContent:)。也不需要拨打performFetch

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

【讨论】:

这是一个简单的解决方案。感谢您的帮助,这不是您第一次提供它:)

以上是关于又一个 NSInternalInconsistencyException,但使用 NSFetchedResultsController的主要内容,如果未能解决你的问题,请参考以下文章

为多个文件下载添加子进度

当我在按钮操作上从 TableView 中删除单元格时,应用程序崩溃了 - iOS Swift

Java程序员怎么才能又轻松又赚钱又拥有技术?

中国又打破了一个芯片行业空白,美国芯片又得降价求售了

二分查找又叫折半查找,是一种简单又快速的查找算法

E4A碰到打开自动闪退又自动打开又闪退一直循环的问题