为什么文本字段不能在方法中刷新?

时间:2018-08-03 23:01:40

标签: swift macos

我尝试刷新文本字段以提供信息。但是我意识到,直到代码结束,我才能更新此显示。我试图使其异步,但没有成功。有人可以用一个简单的例子向我解释吗?

我向您展示了这个简单的代码。当计数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:对不起,我的英语,我是法语...

1 个答案:

答案 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)
    }
}

请注意,我们用相同的名称定义了两个函数,但是它们的签名不相同,这就是为什么它可以正常工作的原因。不要更改签名,它可能无法再编译。

相关问题