通过自己的不良做法更新闭包内的UI?

时间:2016-11-21 02:31:05

标签: swift multithreading closures completionhandler

我是多线程编程的新手,到目前为止,我一直在通过self.myview.setTitle, etc.

更新我的闭包内的UI /视图

以下是我在处理程序/闭包中更新UI的示例代码

SFSpeechRecognizer.requestAuthorization { (authStatus) in
        switch authStatus
        {
        case .authorized:
            self.recordButton.isEnabled = true
        case .denied:
            self.recordButton.isEnabled = false
            self.recordButton.setTitle("User denied access to speech recognition", for: .disabled)
        case .restricted:
            self.recordButton.isEnabled = false
            self.recordButton.setTitle("Speech recognition is disabled for this device", for: .disabled)
        case .notDetermined:
            self.recordButton.isEnabled = false
            self.recordButton.setTitle("Speech recognition has not yet been authorized", for: .disabled)
        default:
            break;
        }
    }

这只是我一直在做的事情的一个示例,但我也是为其他任务做的,就像从天气API下载json数据并更新我的用户界面等等。

现在我听说这是不好的做法,我希望知道为什么。另外,在闭包线程中更新UI的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

更新闭包内的UI并不是一个坏习惯。

完全错误且明确禁止更新主线程上的任何线程上的UI。并且你不知道你的闭包是否在主线程上被调用(和运行)。通常,没有确定性或可能性会在主线程上调用名为异步的完成处理程序。

因此,你应该证明这个代码 在主线程上运行,或者通过故意获取到主线程来确定更新UI之前的线程。