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)
方法以避免竞争条件的方式解决了这个问题。我想避免这种情况,所以当我寻找其他答案时,我会继续这样做。
答案 0 :(得分:3)
根据您的评论,如果第二次呼叫在网络呼叫后的完成块中发生,我猜您正在使用网络呼叫的结果。如果是这种情况,如果您需要在单元格中反映的更改不会影响单元格的高度,您可以只在索引路径中获取单元格,检查它是否为零(如果用户将其滚动到屏幕外)如果单元格仍然可见,则直接应用更改。无需重新加载。