【iOS开发】启动时间优化,runloop的一个小技术点

时间:2022-06-09
本文章向大家介绍【iOS开发】启动时间优化,runloop的一个小技术点,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

刚接触项目不久,最近产品说有一个点要优化,App的启动页面显示时间太长了。一直在开发其它的app,还真没注意这个点,去看了一下还真是,有的时候启动页面的显示时间能有10s。

排查:

  • 用TimeProfile看了一下启动流程,没发现哪里特别耗时,只有一个添加启动后广告的地方能有个1s多。没怎么关心。
  • Google 了一下,添加debug的环境变量:DYLD_PRINT_STATISTICS 值为1. 看了一下库的加载也只有几百ms,都不上秒。问题点应该也不在这里。
  • 回去看那个添加广告页面的地方。发现一句下面这样的代码。while的条件是要广告图片下载完成。
while(condition){
 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
}
  • 不清楚上面这句代码的意思,查了一下当前condition为YES时,当前runloop会一直接收处理其他输入源,当前流程不继续处理,当condition为NO,当前流程继续。但是这个while不会阻塞整个程序的运行。
  • 这就有问题了,如果网络不返回,主线程不是会阻塞。直到网络返回。
  • 重写了一下这个广告添加的逻辑,先查看本地是否有缓存好的图片,有就显示,没有就不显示。同时去服务器拉取要显示的图片地址,并把图片缓存到本地,供下次打开时显示。而不是实时的去下载。

低级错误。原来的同事,只是缓存了一下图片的地址,没有缓存图片本身。还有就是可能也是对上面那个runloop的用法不是很了解,以为不会阻塞。