Swift中的延迟/睡眠无法正常工作

时间:2017-02-25 21:20:36

标签: ios swift delay wait sleep

我在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!"

为什么叫睡眠阻止这些动作?如果我删除了import Darwinsleep,我的代码就可以了。有人有想法吗?抱歉我的英语不好:P

3 个答案:

答案 0 :(得分:3)

像@jcaron说的那样

这里有代码:

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

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

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

答案 1 :(得分:2)

其他人alrady回答了这个问题,我只是想提供一些额外的信息(暂不公开)。

你说Antwort4.backgroundColor = UIColor.green没有被执行。为了澄清,这是执行的,但是你没有看到结果,因为你调用阻止UI的sleep。以下是发生的事情:

  1. Antwort4的背景颜色设置为绿色
  2. 睡眠:阻止阻止应用实际显示绿色背景的用户界面
  3. Antwort4的背景颜色再次设置为红色
  4. 要解决手头的问题,您可以使用Apples Comparing of StrokeThickness on Desktop and Mobile API。因此,您可以使用:

    而不是睡眠
    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()
    }
    

答案 2 :(得分:1)

usleep()功能会阻止您的用户界面。如果您不希望更好地使用此行为,请使用Timer类。