2016-11-07 1 views
0

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?

+0

Il suffit de mettre votre condition, à savoir. 'if! userHasAnswered {...}', à l'intérieur du bloc. – Connor

+0

Utilisez un minuteur à la place si gcd, et lorsque l'utilisateur répond à la question, invalidez le minuteur. –

+0

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

Répondre

0

bien vous devez utiliser scheduled Timer de la classe NStimer

les implémentations sont les suivantes:

vous devez définir une minuterie:

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

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

dans lequel le timeInterval est la période befo Concernant l'exécution de la fonction requise, invocation est la fonction que vous souhaitez exécuter et repeats indique si vous souhaitez que la fonction répète l'invocation jusqu'à son invalidation.

vous pouvez en savoir plus sur NS minuteries dans https://developer.apple.com/reference/foundation/timer

J'espère que cela aide

0

Il est préférable d'utiliser un tableau/dictionnaire des variables bool pour ce genre de problème.

Vous pouvez avoir un tableau ou un dictionnaire comme indiqué dans l'exemple suivant.

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

Ici, Key = question id et Value = a boolean indicating whether it is answered. Vous pouvez le mettre à jour selon que l'utilisateur a répondu à la question particulière ou non. Ensuite, vous pouvez l'utiliser dans votre code de la manière suivante:

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." 
      } 
     } 
    } 
} 

Ne hésitez pas à suggérer des modifications pour le rendre meilleur :)