我之前提出了类似于此问题的问题,但这个问题更多的是关于Swift的一般语言和基本原理。在下面的代码中,该功能是否应该在技术上起作用并更改标签文本?我现在已经运行了一段时间并且每次都失败了。我确保我的所有商店也正确连接。很抱歉,如果答案很明显,我是Swift的新手。
func changeLabel() {
DispatchQueue.main.sync(execute: {
self.testText.text = "YES"
})
}
override func viewDidLoad() {
super.viewDidLoad()
let city:String? = nil
if city == nil {
changeLabel()
}
}
答案 0 :(得分:2)
viewDidLoad
总是从主线程中调用(除非程序员错误地做了 - 而这是另一个问题)。
因此,使用DispatchQueue.main.sync
更新标签是没有意义的。事实上,在这种情况下它很糟糕。当已经在主队列上时调用DispatchQueue.main.sync
将导致应用程序的用户界面挂起,直到应用程序被杀死。
您有两种选择:
DispatchQueue.main.sync
的使用,因为您发布的代码中不需要它。sync
更改为async
。这解决了应用用户界面挂起的问题,它还允许您从任何队列调用changeLabel
方法并正常工作。答案 1 :(得分:-2)
请改用:
func changeLabel() {
DispatchQueue.global().async(execute: {
print("teste")
DispatchQueue.main.sync{
self.testText.text = "YES"
}})
由于