2017-02-25 53 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中使用,而無需再次創建函數。 –