table-view 上下移动如连续跳跃

The table-view moving up and down like jumping continuously

我在 Objective C 和 Xcode 版本为 10.1 的项目中工作。在这个项目中,我使用套接字。在这个应用程序中,我不断地从 Socket 读取数据。我将更新后的值显示到 table 视图中。为此,我重新加载 table 部分 header 的速度与来自套接字的数据一样快。意思是如果我得到 id = 5 然后我尝试找到 id == 5 的部分的索引,我将只更新那个部分。

现在的问题是,当我点击 table header 它会打开该部分的内行 header 然后当我向下滚动时, table-view 移动因为数据来的太快了,上上下下就像不停地跳一样。

例如。 : Table 查看

案例 1 :(Scroll 运行良好)

情况 2:(滚动会导致跳转 Headers)

所以在上面的结构中,当我们点击 Header 1 然后我们向下滚动时,那时候下一个 header 会因为持续更新过程而跳动。

滚动中的这种跳跃 header 效果不会出现在案例 1 的场景中。这仅发生在案例 2 中。

当我重新加载整个 table 而不是一次重新加载唯一的一个部分 header 时,这个问题没有发生。 请帮我解决这个问题。 提前致谢。

我尝试重新加载 header 部分,如下所述。 [tableView beginUpdates]; [tableView reloadSections:[NSIndexSet indexSetWithIndex:i] withRowAnimation:UITableViewRowAnimationNone]; [tableView endUpdates];

当您重新加载 UITableView 的部分时,它会尝试再次执行整个渲染过程。这意味着,它将获取行数、部分数,为该行或部分获取适当的单元格,将计算每一个单元格的高度,然后在屏幕上绘制。

整个过程要花很多时间。由于所有 UI 操作都发生在串行线程的主线程上,并且您正在连续且非常快速地更新 table 视图部分,这将导致很多抖动。

处理这种情况的更好方法是稍微延迟更新。假设每隔 1 分钟,获取最新更新。这可以使用 RxSwift 实现,也可以实现您自己的逻辑。

然后在您这样做之后,您可以尝试的优化是自己更新剖面视图,而不是让 UITableView 为您做这件事。这意味着,根据 UITableView 的当前状态,找到要用数据更新的部分,使用 indexPathsForVisibleRowscellForRow(at indexPath: IndexPath) 获取单元格并直接更新视图.

如果新数据不改变单元格或部分的高度,则此方法可以正常工作。否则,您将不得不使单元格的高度无效,这会引入一点点抖动。

如果您重新加载部分,那么与该部分相关的所有内容都将重新绘制,包括行号、header 内容和默认部分行为(关闭或展开)。您需要更改您的设计或解决所需解决方案的方法 - 例如,使 table non-closable(即 header 和子项始终可见)或其他内容。

如果您使用"heightForRowAtIndexPath:"方法计算身高。也用"estimatedHeightForRowAtIndexPath"这个方法。用行高的方法写代码。