2016-11-07 2 views
0

Meine Anwendung fragt Benutzer Frage und Antwort erhalten, jede Frage hat einige konstante Zeit (zum Beispiel 30 Sekunden) für die Beantwortung. Ich möchte zeigen Benutzer Warnung wie "Last (n) Sekunden ..." und wenn Benutzer nicht in dieser Zeit beantworten - App sollte Frage überspringt. Schrieb einen Code, mit DispatchQueue:Wie Einfügen Alarm nach einiger Zeit in 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." 
    } 

Es funktioniert, aber der Code ausführt, selbst wenn Benutzer Frage rechtzeitig beantwortet. Also, wie kann ich "DispatchQueue.main" "zurücksetzen" oder "löschen", um die Ausführung dieses Codes zu verhindern, wenn der Benutzer rechtzeitig antwortet?

+0

einfach Ihre bedingten setzen, das heißt. 'if! userHasAnsered {...}', innerhalb des Blocks. – Connor

+0

Verwenden Sie stattdessen einen Timer, wenn gcd, und wenn Benutzer die Frage beantwortet, den Timer ungültig machen. –

+0

Es sieht aus wie unmögliche Verwendung (userHasAnswered) Variable, weil es für verschiedene Fragen anders sein wird (einige Fragen rechtzeitig beantwortet, einige übersprungen). Wie benutzt man den Timer? – zzheads

Antwort

0

gut haben Sie scheduled Timer von Klasse zu verwenden NStimer

die Implementierungen sind wie folgt:

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

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

in denen:

Sie einen Timer definieren müssen Die timeInterval ist der Zeitraum vor Die Ausführung der erforderlichen Funktion ist invocation ist die Funktion, die Sie ausführen möchten, und repeats zeigt an, wenn die Funktion Aufruf bis ungültig wiederholen soll.

können Sie mehr über NS-Timer in https://developer.apple.com/reference/foundation/timer

lesen Ich hoffe, es

0

hilft Es ist besser, einen Array/Wörterbuch von Bool Variablen für diese Art von Problem zu verwenden.

Sie können ein Array oder ein Wörterbuch wie im folgenden Beispiel verwenden.

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

Hier Key = question id und Value = a boolean indicating whether it is answered. Sie können es aktualisieren, je nachdem, ob der Benutzer die jeweilige Frage beantwortet hat oder nicht. Dann können Sie es in Ihrem Code auf folgende Weise verwenden:

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

Sek Änderungen vorschlagen, um es besser zu machen :)

Verwandte Themen