私のアプリケーションではユーザーの質問があり、答えを得るために、各質問に一定の時間(たとえば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を「リセット」または「クリア」することはできますか?
ただ、すなわち、あなたの条件を置きます。 'if!userHasAnswered {...}'は、ブロックの内部にあります。 – Connor
gcdの代わりにタイマーを使用し、ユーザーが質問に答えたときにタイマーを無効にします。 –
それは不可能な使用(userHasAnswered)変数のように見えます。なぜなら、それは異なる質問(時間内にいくつかの質問が回答され、いくつかはスキップされます)で異なるからです。タイマーの使い方は? – zzheads