记一次子线程中更新UI导致crash

好久没有写文章了。最近两个多月都在进行大版本迭代。挺烦的。现在工作进入收尾阶段 一直在调试程序。遇到一些有意思的东西会在这里记下来。

今天调试了一个语音创建的bug。当用户第一次启动程序时,会进行麦克风权限判断,当用户点击开启的时候程序就会crash。于是我在手机上卸载了测试版本,重新跑了一遍新程序,崩溃信息如下:

记一次子线程中更新UI导致crash_第1张图片
Snip20170823_12.png

谷歌翻译是:
在从主线程访问引擎后,此应用程序正在从后台线程修改autolayout引擎。 这可能导致发动机损坏和奇怪的崩溃。

其实大致意思一眼就看看出来 你在子线程更新UI布局导致了这次崩溃。

然后我加了全局断点

Snip20170823_15.png

果然是定位到了UI布局上。接着我仔细看了这个方法,发现是在一个block块中调用的。

记一次子线程中更新UI导致crash_第2张图片
Snip20170823_16.png

那么解决起来就很简单了,因为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;
        }

你可能感兴趣的:(记一次子线程中更新UI导致crash)