2017-02-25 7 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!" 

は、なぜこれらのアクションをブロックし、睡眠を呼び出していますか? import Darwinsleepを削除すると、コードがうまく動作します。誰にもアイデアはありますか?私の悪い英語のため申し訳ありません:P

+1

'睡眠'またはバリアントを使用しないでください。あなたは何もしないメインスレッドをブロックしています。 ['dispatch_after'を使用してください(https://developer.apple.com/reference/dispatch/1452876-dispatch_after) – jcaron

答えて

2

その他質問に答えたところ、私はちょっとした情報を提供したかっただけです(まだコメントできません)。

Antwort4.backgroundColor = UIColor.greenは実行されていません。これを明確にするために、これは実行されますが、UIをブロックしているsleepを呼び出すため、結果が表示されません。ここで何が起こるかである:緑色

  • 睡眠へAntwort4

    1. セットの背景色:実際
    2. 再度
    3. 赤に Antwort4の背景色を設定緑色の背景を示すからアプリケーションを防止するUIをブロック

    問題を解決するには、Apple 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() 
    } 
    
  • 1

    usleep()機能はあなたのUIをブロックします。この動作をよりよくしたくない場合は、Timerクラスを使用してください。

    3

    @jcaronはそれを行うためのコードここ

    言ったように:

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

    編集:あなたはこのような任意のviewControllersで使用するための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 
         }) 
    
    +0

    ありがとうございますが、私は知らないことが1つあります:P私は2番目のパラメータとして使用する必要がありますdelay(2、?) –

    +0

    2番目のパラメータはクロージャです。遅延が終了した後にコールする関数の戻り値を使用します。あなたはここでexecute:handler)を返します。私はコードを変更して、関数を再作成せずにviewControllerで使用できるようにしました。 –

    関連する問題