我尝试刷新文本字段以提供信息。但是我意识到,直到代码结束,我才能更新此显示。我试图使其异步,但没有成功。有人可以用一个简单的例子向我解释吗?
我向您展示了这个简单的代码。当计数i(100000)结束时,名为txtLog的文本字段仅显示“ Nothing else”。为什么?
@IBAction func elimineDoublons(_ sender: Any) {
DispatchQueue.main.async {
self.txtLog.stringValue="Nothing else"
}
for i in 0...100000{
print(i)
}
}
您能解释一下还是给我看一个简单的例子?拜托...
PS:对不起,我的英语,我是法语...
答案 0 :(得分:1)
之所以会出现这种现象,是因为您的 for 循环在主队列中运行:@IBAction函数始终在主队列中运行。因此,您正在阻止要在其中运行self.txtLog.stringValue="Nothing else"
的队列。 UI总是在主线程中更新,因此GCD(大中央调度)在运行此代码之前等待循环结束。
请记住,只能在主线程上正确地操作UI组件。
因此,for
循环必须在后台队列中运行。例如,用以下代码替换您的代码:
@IBAction func elimineDoublons(_ sender: Any) {
txtLog.stringValue = "Nothing else"
DispatchQueue.global(qos: .background).async(elimineDoublons)
}
private func elimineDoublons() {
for i in 0...100000 {
print(i)
}
}
请注意,我们用相同的名称定义了两个函数,但是它们的签名不相同,这就是为什么它可以正常工作的原因。不要更改签名,它可能无法再编译。