我是多线程编程的新手,到目前为止,我一直在通过self.myview.setTitle, etc.
以下是我在处理程序/闭包中更新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的正确方法是什么?
答案 0 :(得分:4)
更新闭包内的UI并不是一个坏习惯。
但完全错误且明确禁止更新主线程上的任何线程上的UI。并且你不知道你的闭包是否在主线程上被调用(和运行)。通常,没有确定性或可能性会在主线程上调用名为异步的完成处理程序。
因此,你应该证明这个代码 在主线程上运行,或者通过故意获取到主线程来确定更新UI之前的线程。