0

我有一个 iOS 应用程序,简而言之,它使用 UITableView 和几个按钮来更改表格的内容。我在开发的早期遇到了一个错误,即在 reloadData 调用之前和之后的行数不一致,但后来发现我做错了什么。

然而,现在我从测试人员那里得到一份报告,说他的 iPad 1 崩溃了,查看堆栈跟踪我可以看到同样的错误,如上所述,正在发生。但所有其他 iPad 2 测试人员似乎都可以正常工作,并且他们都使用相同的数据集来填充表格。

这是我填充表格视图的方式:

[tableviewController.data removeAllObjects] //Delete the old data. Tableviewcontroller is the delegate for self.tableview
[self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
[tableviewController setData:[newDataSetArray mutableCopy]]; //Copy over a new dataset array
[self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

如果有人知道为什么会发生这种情况并可以指出,我将非常感激。

编辑:更多细节。在听到这个问题后,我们让测试人员删除了应用程序的本地副本,并获取最新版本。此外,他和其他测试人员都在运行 iOS 5.1.1,据我所知,唯一的不一致是硬件版本。但这没有意义:/

4

1 回答 1

1

我的想法是为什么不这样做:

[tableviewController setData:[newDataSetArray mutableCopy]]; //Copy over a new dataset array
[self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

你真的不需要清除旧的并重新加载,然后设置新的并重新加载。

但是,我会小心线程。看起来这段代码是从非主线程运行的,这意味着表的数据源可能会与数据设置竞争。另一种方法是像这样在主线程上敲打所有东西:

dispatch_async(dispatch_get_main_queue(), ^{
    [tableviewController setData:[newDataSetArray mutableCopy]]; //Copy over a new dataset array
    [self.tableview reloadData];
});

但我也很困惑的是,tableviewController如果您重新加载的表格视图是self.tableview什么?self不一样吗tableviewController

于 2012-10-12T10:08:31.197 回答