前言
页面跳转优化包括资源预加载、自定义push转场、loading动画过渡、骨架屏占位、网络请求前置、网络请求后置、异步处理任务、精简生命周期方法、懒加载以及UI布局优化等方向。
优化方向
资源预加载
- 这里的资源指的是图片资源。对于一些存在轮播图或者banner区的目的页,可以优先加载一张缩略图作为占位;也可以在进入页面之前预加载一张轮播图以备使用。
自定义push转场
- iOS的push动画执行完毕之后才会调用viewController的viewDidLoad方法。且原生的导航push动画在性能较差的机型上可能会花费0.5s甚至更长时间。针对这种场景,可以先push导航控制器,然后自定义转场动画。
loading动画过渡
渐进式骨架屏过渡
网络请求优化
- 异步发起网络请求
这通常是必须的,很少有同步请求数据的场景。
- 避免接口依赖(串行)
应该尽量避免下一个接口的请求依赖上一个接口的数据。如果可以,尽量由上一个页面传入网络请求的必填参数。
- 分清主次和轻重缓急,能延后的请求延后处理。能不请求的暂时不请求
作为开发习惯,开发者通常习惯性的会在进入页面后请求大部分接口。正像大家都会在viewDidLoad中做页面的初始化工作一样。而实际上,并不是所有的接口必须在第一时间请求。在某些主流程页面上,用户进入页面后,首要任务通常是立即为用户呈现一些必要的数据,应当避免用户盲视(即页面白屏)导致用户退出或流失。比如,某直播APP,用户从直播列表点击某个cell进入某个直播间,应该在第一时间为用户拉取视频流或者显示一张主播背景照作为过渡,而非立即请求房间信息或聊天框消息。
- 能合并的接口合并请求
- 网络请求前置
通常网络请求的发起是在viewController的viewDidLoad及其之后。根据实际业务场景,可以考虑将网络请求前置到loadView甚至是init阶段。如果网络数据返回页面依旧未显示,可以暂时保存数据,待到进入页面(viewDidLoad/viewWillAppear/viewDidAppear)时执行UI刷新。
异步处理任务
- 对于一些必须处理的非UI操作,尽量放到子线程异步处理
精简声明周期方法
- 精简viewDidLoad
- 精简viewWillAppear:
- 精简viewDidAppear:
配合懒加载、预加载精简生命周期方法
懒加载
UI布局优化
- 避免创建大量UI和布局
- 精简图层
未完待续~