【发布时间】: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