刚接触项目不久,最近产品说有一个点要优化,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的用法不是很了解,以为不会阻塞。
网友评论