2016-11-07 62 views
0

我的應用程序詢問用戶問題並得到答案,每個問題有一些恆定的時間(例如30秒)來回答。我想要顯示用戶警告像「最後(n)秒......」,如果用戶不會在那個時候回答 - 應用程序應該跳過問題。 寫了一些代碼,使用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

好,你必須使用scheduled Timer從類NStimer

的實現如下:

您需要定義一個計時器:

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

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

其中timeInterval是befo期間重新執行所需的功能,invocation是您想要運行的功能,repeats指示您是否希望函數重複調用直至失效。

您可以在https://developer.apple.com/reference/foundation/timer

閱讀更多關於NS定時器我希望它能幫助

0

這是更好地使用布爾變量的陣列/字典這樣的問題。

您可以擁有一個數組或字典,如下例所示。

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

隨意提出修改建議,使之更好:)