2017-02-25 36 views
1

我在Swift代码中遇到sleep函数的问题。我正在使用import Darwinusleep(400000)。达到睡眠之前的一些行动被阻止,我不知道为什么。这里从我的代码很短的例子:Swift中的延迟/睡眠不起作用

@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

+1

请勿使用“sleep”或变体。你阻止主线程无所事事。使用['dispatch_after'](https://developer.apple.com/reference/dispatch/1452876-dispatch_after) – jcaron

回答

2

其他alrady回答了这个问题,我只是想提供一些额外的信息(目前还不能评论)。

你说Antwort4.backgroundColor = UIColor.green没有执行。为了澄清,这是执行的,但你看不到结果,因为你打电话sleep,这是阻止用户界面。这是发生了什么:中Antwort4

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

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

非常感谢,但有一件事我不知道:P我有什么作为第二个参数delay(2,?) –

+0

第二个参数是闭包,您使用它返回延迟结束后调用它的那个函数。你在这里返回execute:handler)。我更改了代码,以便您可以在任何viewControllers中使用,而无需再次创建函数。 –