Swift 中的 delay/sleep 无效

delay/sleep in Swift is not working

我对 Swift 代码中的 sleep 函数有疑问。我正在使用 import Darwinusleep(400000)。进入睡眠状态之前的某些操作被阻止,我不知道为什么。这是我的代码中的一个简短示例:

@IBAction func Antwort4Button(_ sender: Any) {
    if (richtigeAntwort == "4"){
        Antwort4.backgroundColor = UIColor.green
        Ende.text = "Richtig!"

        NaechsteFrage()
    }
    else {
        Ende.text = "Falsch!"

        //NaechsteFrage()
    }
}

func NaechsteFrage() {
    usleep(400000)

    Antwort1.backgroundColor = UIColor.red
    Antwort2.backgroundColor = UIColor.red
    Antwort3.backgroundColor = UIColor.red
    Antwort4.backgroundColor = UIColor.red

    Ende.text = ""

    FragenSammlung()
}

这几行将不会被执行:

Antwort4.backgroundColor = UIColor.green

Ende.text = "Richtig!"

为什么调用 sleep 会阻止这些操作?如果我删除 import Darwinsleep,我的代码工作正常。有人有想法吗?抱歉我的英语不好:P

usleep() function will block your UI. If you don't want to have this behavior better use the Timer class.

就像@jcaron 说的

这里是执行此操作的代码:

func delay(delayTime: Double, completionHandler handler:@escaping () -> ()) {
        let newDelay = DispatchTime.now() + delayTime
        DispatchQueue.main.asyncAfter(deadline: newDelay, execute: handler)
    }

已编辑:您可以创建一个 viewController 扩展以在任何 viewController 中使用,如下所示:

extension UIViewController {

    func delay(delayTime: Double, completionHandler handler:@escaping () -> ()) {
            let newDelay = DispatchTime.now() + delayTime
            DispatchQueue.main.asyncAfter(deadline: newDelay, execute: handler)
        }
}

所以在您的 viewController 中,您只需这样调用:

delay(delayTime: 2, completionHandler: {
            _ in
            // do your code here
        })

其他人已经回答了这个问题,我只是想提供一些额外的信息(还不能发表评论)。

你说Antwort4.backgroundColor = UIColor.green没有执行。澄清一下,这已执行,但您看不到结果,因为您调用了 sleep,它阻塞了 UI。这是发生了什么:

  1. Antwort4 的背景颜色设置为绿色
  2. 睡眠:阻止 UI 阻止应用实际显示绿色背景
  3. 再次将Antwort4的背景色设置为红色

要解决手头的问题,您可以使用苹果 Displatch API。因此,您可以使用:

而不是 sleept
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    self.Antwort1.backgroundColor = UIColor.red
    self.Antwort2.backgroundColor = UIColor.red
    self.Antwort3.backgroundColor = UIColor.red
    self.Antwort4.backgroundColor = UIColor.red

    self.Ende.text = ""

    self.FragenSammlung()
}