Swift 中的延迟/睡眠不起作用

Posted

技术标签:

【中文标题】Swift 中的延迟/睡眠不起作用【英文标题】:delay/sleep in Swift is not working 【发布时间】: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 【参考方案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。这是发生了什么:

    Antwort4的背景颜色设置为绿色 sleep:阻止应用程序实际显示绿色背景的 UI 再次将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()

【讨论】:

以上是关于Swift 中的延迟/睡眠不起作用的主要内容,如果未能解决你的问题,请参考以下文章

后置摄像头在 Swift 中不起作用

循环,100% CPU 使用,使用睡眠不起作用?

设备处于睡眠模式时的 URLConnection 不起作用

swift: Swift 中的 SnapKit 不起作用

timer_start() 睡眠后的 C 不起作用

延迟解析 JavaScript 不起作用