【问题标题】:UITableView does not load the new state if user scrolling如果用户滚动,UITableView 不会加载新状态
【发布时间】:2021-10-08 15:48:09
【问题描述】:

已解决:这与 UITableViewDiffableDataSource 无关。问题是从 2 个不同的线程按顺序访问领域并且没有得到一致的结果

其中一个线程是主线程,并且滚动以某种方式使主线程忙碌并触发了竞争条件


如果用户在更新时不滚动表格视图,一切正常。

如果用户正在滚动或只是将手指放在 tableview 上,则更新时不会发生动画并且不会显示差异。 我在控制台中没有收到任何错误

数据更新代码如下:

var snapshot = tableViewDataSource.snapshot()
snapshot.deleteAllItems()
snapshot.appendSections([.conversation])
snapshot.appendItems(conversationList, toSection: .conversation)
tableViewDataSource.apply(snapshot)

这是某种预期的行为吗?

【问题讨论】:

  • 为什么代码会在用户“滚动”时运行?
  • 当用户阅读并触摸tableview时,可能会出现新消息,我需要更新。在这种情况下,我不关心动画,但新消息没有出现。即使新状态包含它
  • 为什么不等到滚动/手指没有发生再更新?这就是我的观点。这本身并不会神奇地发生。你正在做。好吧,不要。
  • 我所做的“解决方法”修复,等待。但我不认为这是我应该做的。因此,我问这是预期的行为吗?如果它记录在任何地方,那将有很大帮助

标签: ios swift uitableview realm uitableviewdiffabledatasource


【解决方案1】:

根据我的经验,您必须清楚何时发生 UI 更新。 UI 更新总是发生在主线程上。

当用户主动滚动时,我相信这会阻塞主线程,因此您的 diffable 数据源可能正在更新,但您的应用无法更新 UI,直到用户从显示屏上松开手指。

【讨论】:

  • 那么我预计更新会在稍后发生。但它永远不会出现,除非我再次获取数据。我确保数据源更新发生在主线程中,所以我认为这不是线程问题
猜你喜欢
  • 2011-12-16
  • 1970-01-01
  • 2011-09-18
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
相关资源
最近更新 更多