美文网首页iOS学习笔记程序员iOS Developer
记一次子线程中更新UI导致crash

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

作者: flightlessBirdT | 来源:发表于2017-08-23 15:45 被阅读256次

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

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

    Snip20170823_12.png

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

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

    然后我加了全局断点

    Snip20170823_15.png

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

    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

        本文链接:https://www.haomeiwen.com/subject/pwnddxtx.html