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 id
和 Value = 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."
}
}
}
}
随时提出修改建议以使其变得更好:)
我的应用程序向用户提问并得到答案,每个问题都有固定的时间(例如 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 id
和 Value = 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."
}
}
}
}
随时提出修改建议以使其变得更好:)