2016-11-07 49 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." 
      } 
     } 
    } 
} 

随意提出修改建议,使之更好:)