好久没有写文章了。最近两个多月都在进行大版本迭代。挺烦的。现在工作进入收尾阶段 一直在调试程序。遇到一些有意思的东西会在这里记下来。
今天调试了一个语音创建的bug。当用户第一次启动程序时,会进行麦克风权限判断,当用户点击开启的时候程序就会crash。于是我在手机上卸载了测试版本,重新跑了一遍新程序,崩溃信息如下:
谷歌翻译是:
在从主线程访问引擎后,此应用程序正在从后台线程修改autolayout引擎。 这可能导致发动机损坏和奇怪的崩溃。
其实大致意思一眼就看看出来 你在子线程更新UI布局导致了这次崩溃。
然后我加了全局断点
果然是定位到了UI布局上。接着我仔细看了这个方法,发现是在一个block块中调用的。
那么解决起来就很简单了,因为block是在子线程进行回调的。我们只需要在回调代码块中回到主线程进行UI布局的操作就可以了。
case AVAudioSessionRecordPermissionUndetermined:{
NSLog(@"第一次调用,是否允许麦克风弹框");
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
// CALL YOUR METHOD HERE - as this assumes being called only once from user interacting with permission alert!
dispatch_async(dispatch_get_main_queue(), ^{
if (granted) {
[self showVoiceInputView:btn];
} else {
[self showVoiceAuthorityView];
}
});
}];
break;
}