Mon application demande à l'utilisateur une question et obtenir une réponse, chaque question a un certain temps constant (par exemple 30 secondes) pour répondre. Je veux montrer à l'utilisateur quelque chose comme "Last (n) secondes ..." et si l'utilisateur ne répond pas dans ce temps - l'application devrait ignorer la question. A écrit un code, en utilisant DispatchQueue:Comment insérer une alerte après un certain temps dans 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."
}
Il fonctionne, mais les exécute le code même si l'utilisateur répond à la question dans le temps. Comment puis-je "réinitialiser" ou "effacer" DispatchQueue.main pour empêcher l'exécution de ce code si l'utilisateur répondait à temps?
Il suffit de mettre votre condition, à savoir. 'if! userHasAnswered {...}', à l'intérieur du bloc. – Connor
Utilisez un minuteur à la place si gcd, et lorsque l'utilisateur répond à la question, invalidez le minuteur. –
Cela ressemble à une variable d'utilisation impossible (userHasAnswered), car elle sera différente pour différentes questions (certaines questions ont été résolues dans le temps, d'autres ont été ignorées). Comment utiliser la minuterie? – zzheads