Swift第一次在没有定时器的情况下运行Timer的块



我创建了一个计时器,并将其设置为每30秒重复一次计时器等待30秒来运行第一次,然后再等待30秒进行第二次,我想让它在没有30秒的情况下运行第一次。有办法吗?

Timer.scheduledTimer(withTimeInterval: 30, repeats: true) { timer in
if iteration >= 0 {
runCommands()
iteration -= 1
if iteration == 0 { exit(0) }
}
}

只需调用fire即可。它顾名思义。

Timer.scheduledTimer(withTimeInterval: 30, repeats: true) { timer in
if iteration >= 0 {
runCommands()
iteration -= 1
if iteration == 0 {exit(0)}
}
}.fire()

问题是您没有引用计时器。做一个!

let timer = Timer.scheduledTimer...

现在在下一行中,您可以说timer.fire()。这会导致计时器立即执行其块。

将从计时器闭包调用的代码重构为函数,或者将闭包放入变量中。然后显式调用函数/闭包:

typealias TimerClosure = (_: Timer?) -> Void
let timerClosure: TimerClosure = { [weak self] timer in
guard let self = self else { return }
if self.iteration >= 0 {
self.runCommands()
self.iteration -= 1
if self.iteration == 0 {exit(0)}
}
}
Timer.scheduledTimer(withTimeInterval: 30, repeats: true, block: timerClosure )
timerClosure(nil)

}

编辑:

上面的方法会起作用,但正如其他人所指出的,您也可以手动调用计时器上的fire()

我将留下答案的上面部分,因为它展示了如何设置一个包含闭包的局部变量,然后将其传递给函数并直接调用它,但这里并不需要这样做。相反,只需这样做:

let timer = Timer.scheduledTimer(withTimeInterval: 30, repeats: true) { [weak self] timer in
guard let self = self else { return }
if self.iteration >= 0 {
self.runCommands()
self.iteration -= 1
if self.iteration == 0 { exit(0) }
}
}
timer.fire()

最新更新