objective-c - UITableview 在 reloadData 调用时抛出 "invalid number of rows"错误,但仅适用于 iPad 1 而不是 iPad 2

标签 objective-c ios multithreading ipad thread-safety

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

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

这是我填充表格 View 的方式:

[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,所以据我所知,唯一不一致的是硬件版本。但这没有意义:/

最佳答案

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

[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];
});

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

关于objective-c - UITableview 在 reloadData 调用时抛出 "invalid number of rows"错误,但仅适用于 iPad 1 而不是 iPad 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12856561/

相关文章:

objective-c - 如何在 Swift 中使用 Objective-C#define

ios - 图片IO : PNG invalid PNG file: iDOT doesn't point to valid IDAT chunk

ios - ObjC 对象内存分析/解析 iOS 128kB 限制

c - errno 是线程安全的吗?

java - 多个客户端连接服务器java

iphone - 如何根据 objective-c 中的月份创建周列表?

php - 图像未通过 Objective C 中的 POST 上传到服务器

ios - 如何在 CNContactViewController 上显示返回和完成按钮?

ios - ScrollView 具有不明确的可滚动内容高度

android - android中的多线程