Swift 3.0 中如何在一段时间后插入警报

How insert alert after some time in Swift 3.0

我的应用程序向用户提问并得到答案,每个问题都有固定的时间(例如 30 秒)用于回答。我想向用户显示 "Last (n) seconds..." 之类的警报,如果用户在那段时间不回答 - 应用程序应该跳过问题。 使用 DispatchQueue 编写了一些代码:

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

它有效,但即使用户及时回答问题,这些代码也会执行。 那么,如果用户及时回答,我如何才能 "reset" 或 "clear" DispatchQueue.main 阻止执行此代码?

你必须使用 class NStimer

中的 scheduled Timer

具体实现如下:

您需要定义一个定时器:

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

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

其中timeInterval是执行所需函数之前的那段时间,invocation是你要运行的函数,repeats表示你是否希望函数重复调用直到失效。

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

中阅读有关 NS 计时器的更多信息

希望对你有帮助

这种问题最好用array/dictionary个bool变量。

您可以有一个数组或字典,如下例所示。

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

随时提出修改建议以使其变得更好:)