【问题标题】:TableView: How to proceed after catching 'NSInternalInconsistencyException'?TableView:捕获“NSInternalInconsistencyException”后如何继续?
【发布时间】:2016-05-13 16:02:08
【问题描述】:

我有一个带有UITableView 的应用程序。应用程序与服务器通信。

问题如下:

客户端 1 删除 TableView 的一个单元格。数据更新被传输到服务器,服务器向客户端 2 发送数据更新。同时,客户端 2 从 TableView 中删除一个单元格。由于接收更新,NSInternalInconsistencyException 被抛出,因为之前和之后的单元格数量不符合预期(差异是 2 而不是 1)。

应用崩溃

[tableView endUpdates];

当然我可以用

捕捉异常
- (void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        @try{
            // Send data update to the server
            [sender sendDataToServer:data];

            // Update tableview
            [tableView beginUpdates];
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
            [tableView endUpdates];
        }
        @catch (NSException * e) {
            // Hide red delete-cell-button
            tableView.editing = NO;
            // Jump to previous ViewController
            [self.navigationController popViewControllerAnimated:YES];
        }
    }
}

但是在成功捕获后我得到了一个

[_UITableViewUpdateSupport dealloc] 中的 EXC_BAD_ACCESS 异常。

如何防止应用崩溃?我必须在 catch-block 中做什么来“清理”这种情况?重新加载 tableview 没有任何效果。

编辑:numberOfRows 方法如下所示:

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return [dataSourceArray count];
}

【问题讨论】:

  • 你不要“清理”它——你必须防止它发生!以使此类异常不可能发生的方式编写代码。
  • @Farley 写下你的numberOfRowsInSection 方法
  • 你要从你的数组中删除这个对象吗?
  • deleteRowsAtIndexPath 更新视图但不更新模型。您还必须从数据源数组中删除该对象。然后你可以删除期望块。它永远不会再发生。并删除begin/endUpdates。在这种情况下它没有效果。
  • 听起来需要一些线程同步。看@synchronized(lock) { ... }

标签: ios objective-c uitableview


【解决方案1】:

@synchronized(lock) 解决了我的问题。

我只需要确保只有一个线程能够同时操作数据源数组。现在一切正常,不再出现“NSInternalInconsistencyException”。

感谢 trojanfoe 和 luk2302。

【讨论】:

    猜你喜欢
    • 2020-07-01
    • 2014-01-05
    • 1970-01-01
    • 2017-04-04
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多