【问题标题】:delay/sleep in Swift is not workingSwift 中的延迟/睡眠不起作用
【发布时间】:2017-07-16 15:33:56
【问题描述】:

我对 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

【问题讨论】:

  • 不要使用sleep 或变体。你阻塞了主线程什么都不做。使用dispatch_after

标签: ios swift delay wait sleep


【解决方案1】:

usleep() 函数将阻止您的 UI。如果您不想让这种行为更好地使用Timer 类。

【讨论】:

    【解决方案2】:

    就像@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
            })
    

    【讨论】:

    • 非常感谢,但有一件事我不知道:P 我必须使用什么作为延迟中的第二个参数(2,?)
    • 第二个参数是闭包,你用它来为延迟结束后调用它的人返回函数。你在这里返回执行:处理程序)。我已经更改了代码,因此您可以在任何 viewControllers 中使用而无需再次创建函数。
    【解决方案3】:

    其他人已经回答了这个问题,我只是想提供一些额外的信息(尚无法评论)。

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

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

    要解决手头的问题,您可以使用 Apples 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()
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-03
      • 2012-04-02
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多