Ios 如何强制UILabel更新其文本?

Ios 如何强制UILabel更新其文本?,ios,swift,xcode,uilabel,Ios,Swift,Xcode,Uilabel,我正在使用Swift为iOS编写代码。当我点击一个按钮时,我想将UILabel中的文本设置为更改两次;一次是在我们进入函数调用时,第二次是在调用完成之前。大概是这样的: @IBAction func myButton(_ sender: Any) { // 1. Display "Please Wait..." in a UILabel // 2. Compute a value by calling a function // (it is slow, ta

我正在使用Swift为iOS编写代码。当我点击一个按钮时,我想将UILabel中的文本设置为更改两次;一次是在我们进入函数调用时,第二次是在调用完成之前。大概是这样的:

@IBAction func myButton(_ sender: Any) {

    // 1. Display "Please Wait..." in a UILabel

    // 2. Compute a value by calling a function 
    //    (it is slow, takes several seconds so 
    //    we need the please wait text to tell 
    //    the user it is doing something)

    // 3. Display the results from the computation 
    //    in the same UILabel as above

我遇到的问题是,在调用slow函数之前设置UILabel的文本(
myLabel.text=“Please Wait”
),然后在结果出现时再次设置,只会显示结果文本,因为程序在第一次设置后没有重新绘制屏幕(“Please Wait”文本)。苹果提到它只使用了
.text
属性的最后一次更新,因此这是一种预期行为。在我的职能中,实现我想做的事情的最简单方法是什么?我对线程了解不多,因为我是初学者,所以请对我放松。:)在我设置文本“请稍候…”以便立即更新UILabel后,是否有一个神奇的函数可以调用?

以实现您需要的这种结构

self.display.text = "wait" 
 // do task in background queue like 
DispatchQueue.global(qos: .background).async {
   callSlow() 
   DispatchQueue.main.async {
      self.display.text = "done" 
   }
}

由于长时间的计算似乎发生在主线程中,因此它会阻止更新标签

,因此通常不应使用
.background
QoS。在某些情况下(特别是在低功耗模式处于活动状态时),它可能会导致CPU不足
.userInitiated
对于这个用例来说可能是一个更好的QoS。答对了!非常感谢施胡汗!!!!那很有魅力!现在我只需要仔细阅读代码中实际发生的事情。令人惊叹的!!有趣的观察。。。有了上面提到的代码结构,我的慢功能现在需要2-3倍的时间才能完成。。。这样添加一个单独的线程似乎会带来性能损失。我想知道是否有办法解决这个问题…保罗-太棒了!如果我将QoS更改为.userInitiated,我将恢复速度。后台QoS慢了2-3倍!令人惊叹的!非常感谢你和施可汗!