美文网首页
UITableView 优化

UITableView 优化

作者: NapoleonY | 来源:发表于2018-11-19 20:45 被阅读16次

    概述

    假设当前页面有一个UITableView,共有100行,如果

    1. Cell 的重用
      UITableView 只会创建一屏幕的Cell, 其他的都从重用池中取出来重用。因此可以减少内存的开销
      注意:

      • func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell绑定数据会延长创建 Cell 的时间,因此尽可能在func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)中绑定数据,可以解决展示速度的问题。
      • 对于某些内容需要根据 model 中数据拼接而成(label.text = "time:(time) length:(length)")时,可以先在 model 中拼接完毕,最后在willDisplay cell:中从 model 中直接取出要显示的内容
    2. 提前计算并缓存好高度

      • 因为func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat调用最为频繁,具体可以查看参考3中WBStatusTimelineViewController.m中代码,里面的YYTableView的高度是在_layouts数组中的。在获取到新的 JSON 数据后,会首先计算对应 cell 的高度,然后缓存,在调用func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat时直接从数组中取出
    3. 尽量使所有的view 不透明(isOpaque = true),可以引用参考1中的一段话来解释原因:

      当源纹理是完全不透明的时候,目标像素就等于源纹理。这可以省下 GPU 很大的工作量,这样只需简单的拷贝源纹理而不需要合成所有的像素值。

    4. 尽量少用或不用透明图层

    5. 如果cell内显示的内容来自 web,使用异步加载,并缓存(SDWebImage)请求结果

    6. 同时设置masksToBoundscornerRadius会导致离屏渲染。设置这两个属性的控件数量越多,对性能影响越大
      备注:离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。离屏渲染耗时是发生在离屏这个动作上面,而不是渲染。为什么离屏这么耗时?原因主要有创建缓冲区和上下文切换。创建新的缓冲区代价都不算大,付出最大代价的是上下文切换。

    未完待续

    参考

    1. 绘制像素到屏幕上
    2. iOS 保持界面流畅的技巧
    3. YYKit

    相关文章

      网友评论

          本文标题:UITableView 优化

          本文链接:https://www.haomeiwen.com/subject/dcaafqtx.html