2016-11-07 3 views
0

私のアプリケーションではユーザーの質問があり、答えを得るために、各質問に一定の時間(たとえば30秒)があります。 "Last(n)seconds ..."のようなユーザーの警告を表示し、その時間にユーザーが応答しない場合、アプリは質問をスキップする必要があります。 はDispatchQueueを使用して、いくつかのコードを書いた:Swift 3.0でしばらくしてから挿入警告する方法

let timePerQuestion = 20 
    let timeStartAlert = 10 

    for i in (0..<timeStartAlert) { 
     DispatchQueue.main.asyncAfter(deadline: (.now() + .seconds(timePerQuestion-timeStartAlert+i))) { 
      self.failureLabel.text = "Left \(Int(timeStartAlert-i)) seconds..." 
      self.failureLabel.isHidden = false 
     } 
    } 
    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(timePerQuestion)) { 
     self.failureLabel.text = "Reseting question" 
     self.failureLabel.isHidden = false 
     self.quiz.skipQuestion() 
     self.playNewRound() 
     self.failureLabel.text = "Sorry, that's not it." 
    } 

それは動作しますが、これらのコードは、ユーザーが時間内に質問に答えていても実行されます。 したがって、ユーザーが時間通りに回答した場合、このコードを実行しないように、DispatchQueue.mainを「リセット」または「クリア」することはできますか?

+0

ただ、すなわち、あなたの条件を置きます。 'if!userHasAnswered {...}'は、ブロックの内部にあります。 – Connor

+0

gcdの代わりにタイマーを使用し、ユーザーが質問に答えたときにタイマーを無効にします。 –

+0

それは不可能な使用(userHasAnswered)変数のように見えます。なぜなら、それは異なる質問(時間内にいくつかの質問が回答され、いくつかはスキップされます)で異なるからです。タイマーの使い方は? – zzheads

答えて

0

だけでなく、あなたが以下のように実装がされているクラスNStimer

からscheduled Timerを使用する必要があります。

あなたはタイマーを定義する必要があります。中

var timer = Timer()//NStimer()in older versions of swift

timer = scheduledTimer(timeInterval: TimeInterval, invocation: NSInvocation, repeats: Bool)

timeIntervalは期間befoです必要なファンクションの実行を再実行する場合は、repeatsは、ファンクションを無効にするまで呼び出しを繰り返すかどうかを示します。

あなたは、私はそれはそれはこの種の問題のためのブール変数の配列/辞書を使用することをお勧めします

0

を役に立てば幸いhttps://developer.apple.com/reference/foundation/timer

にNSタイマーについての詳細を読むことができます。

次の例に示すように、配列または辞書を使用できます。

var questionAnswered: [String: Bool] = ["1" : false, "2" : false, "3" : false, "4" : false, "5" : false] 

ここでは、Key = question idValue = a boolean indicating whether it is answeredです。ユーザーが特定の質問に回答したかどうかによって更新できます。その後、あなたは次のようにあなたのコードでそれを使用することができます。

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(timePerQuestion)) { 
    if let answered: Bool = self.questionAnswered[questionID] { 
     if !answered { 
      DispatchQueue.main.async { 
      self.failureLabel.text = "Reseting question" 
      self.failureLabel.isHidden = false 
      self.quiz.skipQuestion() 
      self.playNewRound() 
      self.failureLabel.text = "Sorry, that's not it." 
      } 
     } 
    } 
} 

はそれを改善するために、編集内容を提案するお気軽に:)

関連する問題