【发布时间】:2023-03-19 01:05:01
【问题描述】:
调用 tableView.reloadData() 似乎会在不同的线程上启动重新加载。如果我立即尝试选择已添加到数据结构中的单元格,则 TableView 可能尚未重新加载它。有没有办法判断 TableView 何时完成 reloadData() 过程。我的实际代码是:
DispatchQueue.main.async {
self.tableView.reloadData()
self.selectNode(node: newNode)
}
其中 selectNode 是我定位显示该节点的 TableViewCell 的函数。通常,它会失败,因为 TableView 尚未重新显示它。我可以通过插入一个等待循环来“蛮力”解决方案,该循环检查 TableView 自重新加载以来是否请求了我的所有行,但我希望有一个更优雅的解决方案。一般来说,我也对等待循环感到不舒服。
【问题讨论】:
-
您可能希望在主线程上运行 reloadData(),我认为这是最佳实践 -
DispatchQueue.main.async { self.tableView.reloadData() }。这将有助于避免您遇到的竞争条件。 -
reloadData() 在后台线程上不起作用(假设您在主线程上调用它,您应该始终这样做)。通话一返回就完成了;你不需要做任何其他事情。也许您的问题是仅重新加载可见行?见the reference。
-
从我的代码中可以看出,我在主线程上调用它,然后还尝试在主线程上选择一个单元格。我自己管理行选择。我之所以调用 reloadData,是因为我刚刚在表格底部附近添加了一个新项目并想要选择它。 select 方法失败,因为在调用后尚未立即重新加载单元格。所以,凭经验,我不得不说 reloadData 似乎没有在主线程上运行。 tableView cellForRowAt: 中的打印语句确认它在从 reloadData 调用返回后似乎继续良好
标签: ios swift uitableview