UITableView优化

TableViewCell 复用

在cellForRowAtIndexPath:回调的时候只创建实例,快速返回cell,不绑定数据。在willDisplayCell: forRowAtIndexPath:的时候绑定数据(赋值)

高度缓存 - 预排版

在tableView滑动时,会不断调用heightForRowAtIndexPath:,当 cell 高度需要自适应时,每次回调都要计算高度,会导致 UI 卡顿。为了避免重复无意义的计算,需要缓存高度
(Dictionary, NSCache)
FDTemplateLayoutCell

Texture/AsyncDisplayKit/ASDK

ASDK 的作者是 Scott Goodson (Linkedin),
他曾经在苹果工作,负责 iOS 的一些内置应用的开发,比如股票、计算器、地图、钟表、设置、Safari 等,当然他也参与了 UIKit framework 的开发。后来他加入 Facebook 后,负责 Paper 的开发,创建并开源了 AsyncDisplayKit。目前他在 Pinterest 和 Instagram 负责 iOS 开发和用户体验的提升等工作

阻塞主线程的任务

Layout

  1. 文本高度计算
  2. 视图布局计算

Rendering

  1. 文本渲染
  2. 图片解码
  3. 图形绘制

UIKit Objects

  1. 对象创建
  2. 对象调整
  3. 对象销毁

总结大体原因

  • UI 渲染需要时间较长,无法按时提交结果;
  • 一些需要密集计算的处理放在了主线程中执行,导致主线程被阻塞,无法渲染 UI 界面;
  • 网络请求由于网络状态的问题响应较慢,UI 层由于没有模型返回无法渲染

优化方向

文本和布局的计算、渲染、解码、绘制都可以通过各种方式异步执行,但 UIKit 和 Core Animation 相关操作必需在主线程进行。ASDK 的目标,就是尽量把这些任务从主线程挪走,而挪不走的,就尽量优化性能
视图的惰性加载:ASDisplayNode对UIView封装,它可以在后台线程创建和修改,直到第一次在主线程访问 view 或 layer 属性时,它才会在内部生成对应的对象
图片解码的时机