iOS性能最佳实践系列之--加快页面加载的检查清单

如果一个页面加载慢,会给用户带来最直接的伤害。下面整理了一些tips,来保证页面的加载速度。

跳转事件触发后不要做阻塞操作

过去review代码时发现过一个问题。某个按钮点击后需要跳转到另外一个页面,但这个页面需要一些权限才能访问。于是代码里点击事件触发后,发了一个网络请求去校验权限,校验成功后再跳转。从用户的角度看,相当于卡了一下再跳新的页面,体验很糟糕。
建议有两种做法:
1 提前做好权限校验
2 直接进入新页面后再做权限校验,没有权限显示无权限的背景图

UIViewController的生命周期要避免阻塞
UIViewController的生命周期方法都在主线程,不要因为做消耗资源的事情(除了初始化视图)导致主线程被阻塞。

有消耗资源的操作放到子线程里,需要做UI渲染再回到主线程

下面是检查清单:

1
2
3
4
5
6
7
8
init
initWithNibName:bundle
viewWillAppear
viewDidAppear
viewDidLoad
viewWillDisappear
viewDidDisappear
...

如果接口请求慢,先加载缓存,再刷最新数据

如果页面的网络请求很慢,会出现白屏转菊花很久的情况,改善的策略如下。
1 先加载缓存数据
2 同步请求网络数据,网络数据请求完成后和本地数据校对,得出需要变化的数据。
3 将新增的数据加载到页面里,并提示“有数据更新”(类似新浪微博)

UITableView的DataSource的代理实现要避免阻塞

UITableView的DataSource回调函数在主线程,要避免耗时计算。

下面是检查清单:

1
2
3
tableView:cellForRowAtIndexPath
tableView:heightForRowAtIndexPath
...

减少UITableView高度计算次数

  • 有多种Cell或高度是动态的
    • 设置estimatedRowHeight(设置后会开启self—sizing,自动计算高度)
  • 只有一种Cell并且高度固定
    • 设置rowHeight
    • 不要重载”tableView:heightForRowAtIndexPath”

UICollectionView的DataSource的代理实现要避免阻塞

UICollectionView生命周期的回调函数在主线程,要避免耗时计算。
下面是检查清单:

1
2
3
collectionView:cellForItemAtIndexPath
collectionView:layout:sizeForItemAtIndexPath
collectionView:didSelectItemAtIndexPath
Blacktea wechat
ex. subscribe to my blog by scanning my public wechat account
记录生活于感悟,您的支持将鼓励我继续创作!