Bug现象1
在项目中,在iOS9上 从
VC1 push
到VC2
会卡顿3-5秒,
从VC1 push
到VC3
不会卡顿。
用
Time Profiler
检测,发现push VC2
页面,主线程会卡顿。
但是因为它的检测显示:调用的都是系统的方法,没有我原生的代码,不会分析,所以也就作罢了。
网上答案
网上的分析大致有两种
1,是这个延迟 卡顿 是iOS7那个经典的背景色问题,修改背景颜色为白色就行了。
我换了颜色,发现并没有任何作用。
2,是新的页面请求数据太多,需要放到异步线程中。
其实新页面的数据处理我都在异步线程中,打印Log发现,卡完3秒以后,这些Log才打印。对我来说无用。
解决方案
在一篇文章中找到了线索,可能是字体的原因。
需要修改成系统字体
于是查找Xib中加载的所有字体,发现有一个Label用了一个非系统字体。
修改成系统字体以后,效果太明显了,一下子从卡顿将近5秒变成了1秒
原因分析
1,导航控制器
push
新页面的时候,其实是把新页面的东西都加载好了以后才真正push
的,
这个时候viewDidLoad
viewWillAppear
都已经调用完成了。
2,可能是非系统字体初次使用的时候会进行懒加载吧,如果这个字体在项目中本来就没有内置,那卡的就会很严重。
后续相关:Bug现象2
在项目中,在iOS9上 从
VC1 push
到VC2 , VC2
用到了讯飞语音,并且进去VC2
以后,有个倒计时动效,这个动效初开始的时候 会卡顿3秒
左右才运行动效
但是从VC3 push
到VC2
不会卡顿。动效很流畅
同样一个页面,从不同的入口进去就有的卡,有的不卡。🙄
报错为[avas] AVAudioSession.mm:1053:-[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.
解决方案
多加了一句代码
[_pcmRecorder stop];
原始代码
- (void)viewDidLoad {
[super viewDidLoad];
[UIApplication sharedApplication].idleTimerDisabled = YES;
//配置讯飞
[self configIFly];
//开启监听
[self startSpeech];
//关闭监听
[self.iFlySpeechEvaluator stopListening];
}
修改后的代码
- (void)viewDidLoad {
[super viewDidLoad];
[UIApplication sharedApplication].idleTimerDisabled = YES;
//配置讯飞
[self configIFly];
//开启监听
[self startSpeech];
//关闭监听
[_pcmRecorder stop];
[self.iFlySpeechEvaluator stopListening];
}
原因分析
具体原因未知。🤔
viewDidLoad
只所以先开始讯飞,然后关闭讯飞,是因为不这样的话,在页面需要用讯飞的时候会报错,可能是讯飞的坑吧。
网友评论