如果在另一个表更新后调用太快,tableView.reloadRows 会闪烁

Posted

技术标签:

【中文标题】如果在另一个表更新后调用太快,tableView.reloadRows 会闪烁【英文标题】:tableView.reloadRows flickers if called too quickly after another table update 【发布时间】:2016-11-24 01:46:29 【问题描述】:

This video demonstrates the issue I'm visually having.

每隔一段时间,我都会调用这个块:

self.tableView.beginUpdates()
self.tableView.insertRows(at: [indexPath], with: rowAnimation)
self.tableView.endUpdates()

self.tableView.scrollToRow(at: indexPath, at: scrollPosition, animated: true)
self.tableView.reloadRows(at: [indexPath], with: .automatic)

让我们不要过多地询问它(insertRows 调用和立即 reloadRows 调用)。这是解决 SlackTextViewController 中的错误的建议解决方案。 The bug in question for those curious.

现在,我在别处打电话:

self.tableView.reloadRows(at: [indexPath], with: .automatic)

当我们在两种情况下处理相同的 indexPath 时,如果这两个块运行得太快,您会遇到闪烁。

我会发现通过使用dispatchQueue(:asyncAfter) 方法人为地延迟self.tableView.reloadRows(at: [indexPath], with: .automatic) 的第二次调用非常不方便。

我该如何处理?

更新:目前,我已通过使用dispatchQueue(:asyncAfter) 方法来解决此问题,以避免出现竞争条件。不过我想避免这种情况,所以我会在寻找其他答案时继续这样做。

【问题讨论】:

是否有任何理由同时重新加载和插入?应该只打电话给他们中的任何一个 原始块是由于我链接的问题。另一个调用发生在完成块中,完成块被调用的速度取决于互联网连接。 【参考方案1】:

根据您的评论,如果第二次调用发生在网络调用之后的完成块中,我猜您正在使用网络调用的结果。如果是这种情况,如果您需要在单元格中反映的更改不会影响单元格的高度,您可以只获取索引路径处的单元格,检查它是否为 nil(以防用户将其滚动到屏幕外)如果单元格仍然可见,则直接应用更改。无需重新加载。

【讨论】:

我会探索这个!

以上是关于如果在另一个表更新后调用太快,tableView.reloadRows 会闪烁的主要内容,如果未能解决你的问题,请参考以下文章

如果滚动到底部太快,JavaFX TableView 会崩溃,自定义单元格也会在操作上变得不合逻辑

iPhone SDK:使用新行插入和更新 UITableView

在另一个视图控制器展开 segue 后重新加载 UIView 数据上的自定义 tableview

UItableView滚动到特定位置

在主线程上调用 tableView.reloadData 后 UITableView 不刷新

通过 C++ 单击按钮后更新 QML TableView