![](/img/trans.png)
[英]What is the most efficient way to display CVImageBufferRef on iOS
[英]What is the most efficient way to display a table with multiple columns in iOS?
我的问题是加载缓慢,滚动速度很快。
我必须显示一个有 10 列的表格:
+-----+------+------+------+------+------+------+------+------+-------+ | Pos | Name | Col3 | Col4 | Col5 | Col6 | Col7 | Col8 | Col9 | Col10 | +-----+------+------+------+------+------+------+------+------+-------+ | 1 | Foo | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 2 | Bar | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 3 | Baz | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +-----+------+------+------+------+------+------+------+------+-------+
忽略表头(我不是显示它)我使用UITableView
与子类UITableViewCell
来表示数据。
我的自定义UITableViewCell
有 10 个UILabel
子视图,全部添加到它的contentView
。 每列一个。
我只是在UITableView
上的cellForRowAtIndexPath
方法中为每个UILabel
子视图设置文本值。
在任何时候,屏幕上大约有 14 行。 滚动速度超级快。 我的reuseIdentifier
运行良好。
但是,表的初始加载速度明显较慢。 比我使用UITableView
其他屏幕慢很多,但那些列的数量要少得多。
我的单元格都设置为opaque
(我理解这是默认设置)。
我缺少什么技巧吗? 是否有太多的意见? 我应该采取另一种方法吗? 或者我做得很好,我应该在我的代码中寻找另一个影响加载时间的问题吗?
更新:
我已经运行了仪器,大部分时间(500 毫秒 74.5%)是:
CA::Layer::layout_and_display_if_needed(CA::Transaction*)
更新:
一些人认为我的数据是瓶颈。
我正在使用NSFetchedResultsController
。
没有计算。 每行的数据直接从相应的实体加载,数据按原样显示。 我不会遍历对象图来从任何其他关系或类似的东西中获取数据。
启用 CoreData SQLDebug
,我可以看到 20 行的总提取执行时间为 0.0014 秒。 我的批量大小设置为 20(比屏幕上可见的略多)以帮助滚动。
滚动速度非常快,所以我认为数据不是这里的问题。
UITableViews 通常用于显示一列数据。 您可以将UICollectionView用于此类事情。
或者,如果您想以一种艰难的方式进行操作,您可以基于 scrollview 实现您自己的表格视图。
但是关于缓慢加载 - 你是从某个网络服务加载数据还是只是简单的演示,所有数据的值都相同?(如果不是 - 尝试这种方式来理解问题)
尝试一次插入一行,假设在您的 viewDidLoad 或 viewwillappear 中,如果您尝试获取所有数据并进行一些计算,则需要时间。 所以我的建议是将一行数据插入它,然后再插入另一行。
通过一些更改,我现在将屏幕加载所需的时间减少了一半。
主要的变化是我不再在每一行上使用 10 个不同的子视图(每列一个子视图)。 相反,我现在每个单元格只使用一个子视图。
为了让每个单元格显示数据,我使用了附加到单元格contentView
的子类UIView
。
在那个子类UIView
我drawAtPoint:withAttributes:
了drawRect
方法以使用drawAtPoint:withAttributes:
。 用不同的文本和位置调用 10 次似乎比定位 10 个不同的UILabel
快得多。
StackOverflow 上的这个答案为我指明了正确的方向。
另一个较小的更改是缓存NSClassFromString(myCustomCellName)
的结果,每次为表中的每一行调用新的结果(当然除非它被重用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.