heightForRowAtIndexPath 和 UITableView scrollToBottom 的初始加载性能不佳

Posted

技术标签:

【中文标题】heightForRowAtIndexPath 和 UITableView scrollToBottom 的初始加载性能不佳【英文标题】:Poor initial load performance with heightForRowAtIndexPath and UITableView scrollToBottom 【发布时间】:2015-07-14 00:05:23 【问题描述】:

我有一个 UITableView,它通过适当的机制(使用 FetchedResultsController 等)从 CoreData 读取信息。此信息可以是文本信息,也可以是要加载到 tableview 中的本地图像的 URL。

数据需要以自下而上的方式填充到表格中(类似于消息传递应用程序)。我的目标是 ios 8+,但如果我使用estimatedHeightForRowAtIndexPath,我会在 3+ 多行标签和图像上得到可怕的抖动。除非它是单行 UILabel,否则估计似乎太远了。我的预感是细胞高度是以自上而下的方式估计的,因此细胞高度从细胞顶部到细胞底部增长。这意味着从上到下滚动很好,但从下到上不是,因为当我向上滚动时,单元格正在“向下”动态调整大小。

我目前正在使用 heightForRowAtIndexPath 来计算单元格高度。这样做的问题是,最初加载视图需要很长时间,因为单元格高度都是一次计算的。我正在使用单元格高度缓存来存储单元格高度,以便在加载视图后,滚动非常流畅。

所以我的问题是这样的:如何使用 heightForRowAtIndexPath 而不需要 3-5 秒的初始加载?

还有一个额外的问题,当您的单元格高度差异很大时,有什么方法可以可靠地使用estimatedHeightForRowAtIndexPath?我们说的是从 44px 到 300px 的任何地方。根据我的阅读,在这种情况下我根本无法使用estimatedHeight 计算。

我已经用尽了有关估计高度/高度ForRowAtIndexPath 的所有 *** 帖子,现在我开始不止一次地查看相同的帖子。所以我被卡住了。

【问题讨论】:

仪器告诉你什么?对应用程序运行时间分析器,而不是预知确定延迟在哪里。 预感是 Apple 如何在屏幕上为单元格动态分配空间的猜测。我确定 heightForRowAtIndexPath 是最初 3-5 秒加载命中的原因。当视图首次加载时,它会消耗 73% 的运行时间。没有其他东西高于 1-2%。 很高兴知道您在 Instruments 中运行了它。 heightForRowAtIndexPath 的 inside 的哪一行花费了时间?它是一个获取还是其他东西?发布 Instruments 个人资料会很有帮助。 我在此方法的时间分析器中没有获得其他信息。你还指望我在这里找到什么信息?我不能比现在更有效地计算高度。我想我会将高度缓存到磁盘而不是加快速度。如果你能给我举个例子,那会很有帮助。 在仪器中,如果您双击方法名称,它将显示该方法的源代码以及每行消耗的百分比。这会告诉你慢在哪里。从那里开始,它将为您指明正确的方向。 【参考方案1】:

为什么 woncha 在表格中填充几行以填充可见区域和之后 viewDidAppear 开始在表一或二的顶部填充较旧的消息 当时没有动画,自动或其他。 这样随着uitableview人口的推迟 我认为你的表现还算过得去。

或者你可以通过Skype方式来做,推迟餐桌的人数 旧消息,直到桌子从顶部边缘反弹。

【讨论】:

以上是关于heightForRowAtIndexPath 和 UITableView scrollToBottom 的初始加载性能不佳的主要内容,如果未能解决你的问题,请参考以下文章

heightForRowAtIndexPath 和 UITableView scrollToBottom 的初始加载性能不佳

NSAutoresizingMaskLayoutConstraint 的 UITableViewCell 舍入错误,但在 Storyboard 和 heightForRowAtIndexPath 中正

iOS 触发单格 tableView:heightForRowAtIndexPath:

heightForRowAtIndexPath 总是被调用两次

在 iOS 7 中的 cellForRowAtIndexPath 之后不调用 heightForRowAtIndexPath

从 cellForRowAtIndexPath 中调用 heightForRowAtIndexPath?