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

时间:2016-11-24 01:46:29

标签: ios swift uitableview reloaddata nsindexpath

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时,如果这两个块运行得太快,你会遇到闪烁。

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

我怎么能接近这个?

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

1 个答案:

答案 0 :(得分:3)

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