Swift 计时器,在特定时间段之前不会再次 运行
Swift Timer that will not run again until a certain period of time
这被证明是一个挑战,我想要一个计时器,它触发一个脉冲 10 秒,然后有效地阻止它再次 运行 直到至少 1 秒过去。
这是 pulse 的代码,但是我怎样才能阻止它在 1 秒后再次触发 - 我可以在定时器中放置一个定时器吗?
任何帮助将不胜感激。
func pulseOn(on: Bool) {
var pulseCount = 4
Timer.scheduledTimer(withTimeInterval: 0.025, repeats: true)
{ timer in
print("PulseCount: \(pulseCount)")
pulseCount = pulseCount - 1
if pulseCount < 1 {
timer.invalidate()
}
}
}
可能是这样的。添加一个布尔值;
var runPulse: Bool = false
原定时器功能:
func pulseOn(on: Bool) {
var pulseCount = 4
Timer.scheduledTimer(withTimeInterval: 0.025, repeats: true)
{ timer in
print("PulseCount: \(pulseCount)")
secondCheck() //new funtion
pulseCount = pulseCount - 1
if pulseCount < 1 {
timer.invalidate()
}
}
}
新函数:
func pulseOn(on: Bool) {
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false)
{ timer in
self.runPulse = true
}
}
然后在任何触发 pulseOn 函数的地方都可以添加一个 if 语句。
if runPulse {
pulseOn()
}
测量两个事件之间的时间时,使用 Date
及其 timeIntervalSince*
函数代替计时器。
使用 属性 lastPulse
记录最后一个脉冲的时间,并使用 Bool
属性 pulseActive
记录脉冲是否进入进行中。只有 运行 如果 1 秒过去并且脉冲未激活,则您的功能。
// time of last pulse
// seed lastPulse with distantPast so first pulse will always succeed
var lastPulse = Date.distantPast
// are we in the middle of running a pulse?
var pulseActive = false
func pulseOn(on: Bool) {
guard !pulseActive && abs(lastPulse.timeIntervalSinceNow) >= 1 else { return }
pulseActive = true
// record the time of this pulse
lastPulse = Date()
var pulseCount = 4
Timer.scheduledTimer(withTimeInterval: 0.025, repeats: true)
{ timer in
print("PulseCount: \(pulseCount)")
pulseCount = pulseCount - 1
if pulseCount < 1 {
timer.invalidate()
pulseActive = false
// If you want the time from last pulse end to be 1 second
// then set lastPulse here instead
//lastPulse = Date()
}
}
}
备注:
- 您的
on:
Bool
未使用。我把它留在那里是因为我只想突出显示新代码。
- 不清楚您希望 1 秒的间隔是从脉冲开始到脉冲开始还是脉冲结束到脉冲开始。如果您希望脉冲开始至少间隔 1 秒,请使用所写的代码。如果你希望下一个脉冲在前一个脉冲结束后至少一秒开始,那么在定时器失效时设置
lastPulse = Date()
。
这被证明是一个挑战,我想要一个计时器,它触发一个脉冲 10 秒,然后有效地阻止它再次 运行 直到至少 1 秒过去。
这是 pulse 的代码,但是我怎样才能阻止它在 1 秒后再次触发 - 我可以在定时器中放置一个定时器吗? 任何帮助将不胜感激。
func pulseOn(on: Bool) {
var pulseCount = 4
Timer.scheduledTimer(withTimeInterval: 0.025, repeats: true)
{ timer in
print("PulseCount: \(pulseCount)")
pulseCount = pulseCount - 1
if pulseCount < 1 {
timer.invalidate()
}
}
}
可能是这样的。添加一个布尔值;
var runPulse: Bool = false
原定时器功能:
func pulseOn(on: Bool) {
var pulseCount = 4
Timer.scheduledTimer(withTimeInterval: 0.025, repeats: true)
{ timer in
print("PulseCount: \(pulseCount)")
secondCheck() //new funtion
pulseCount = pulseCount - 1
if pulseCount < 1 {
timer.invalidate()
}
}
}
新函数:
func pulseOn(on: Bool) {
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false)
{ timer in
self.runPulse = true
}
}
然后在任何触发 pulseOn 函数的地方都可以添加一个 if 语句。
if runPulse {
pulseOn()
}
测量两个事件之间的时间时,使用 Date
及其 timeIntervalSince*
函数代替计时器。
使用 属性 lastPulse
记录最后一个脉冲的时间,并使用 Bool
属性 pulseActive
记录脉冲是否进入进行中。只有 运行 如果 1 秒过去并且脉冲未激活,则您的功能。
// time of last pulse
// seed lastPulse with distantPast so first pulse will always succeed
var lastPulse = Date.distantPast
// are we in the middle of running a pulse?
var pulseActive = false
func pulseOn(on: Bool) {
guard !pulseActive && abs(lastPulse.timeIntervalSinceNow) >= 1 else { return }
pulseActive = true
// record the time of this pulse
lastPulse = Date()
var pulseCount = 4
Timer.scheduledTimer(withTimeInterval: 0.025, repeats: true)
{ timer in
print("PulseCount: \(pulseCount)")
pulseCount = pulseCount - 1
if pulseCount < 1 {
timer.invalidate()
pulseActive = false
// If you want the time from last pulse end to be 1 second
// then set lastPulse here instead
//lastPulse = Date()
}
}
}
备注:
- 您的
on:
Bool
未使用。我把它留在那里是因为我只想突出显示新代码。 - 不清楚您希望 1 秒的间隔是从脉冲开始到脉冲开始还是脉冲结束到脉冲开始。如果您希望脉冲开始至少间隔 1 秒,请使用所写的代码。如果你希望下一个脉冲在前一个脉冲结束后至少一秒开始,那么在定时器失效时设置
lastPulse = Date()
。