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()