gpt4 book ai didi

swift - 停止并重新启动计时器

转载 作者:行者123 更新时间:2023-11-28 06:10:41 27 4
gpt4 key购买 nike

我想停止这个计时器,然后从我停止的地方重新启动它。

secondsTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(addSeconds), userInfo: nil, repeats: true)

下面,有人建议我不应该在我的计时器处理程序中增加计时器。为什么不?

例如,使用GCD定时器:

func countSeconds() {

secondsTimer = DispatchSource.makeTimerSource(queue: .main)
secondsTimer?.schedule(deadline: .now(), repeating: 1.0)

secondsTimer?.setEventHandler { [weak self] in

self?.addSeconds()
}
}

@objc func addSeconds() {
seconds += 1
}

func startGame() {
secondsTimer?.resume()
}

最佳答案

我们不会暂停/恢复 Timer 实例。我们用 invalidate() 来阻止他们.当您想要重新启动它时,只需创建新的计时器即可。

请引用the Timer documentation ,也可以直接在 Xcode 中使用。


请注意,您可以 suspendresume GCD 计时器,DispatchSourceTimer .

var timer: DispatchSourceTimer?  // note, unlike `Timer`, we have to maintain strong reference to GCD timer sources

func createTimer() {
timer = DispatchSource.makeTimerSource(queue: .main)
timer?.schedule(deadline: .now(), repeating: 1.0)

timer?.setEventHandler { [weak self] in // assuming you're referencing `self` in here, use `weak` to avoid strong reference cycles
// do something
}

// note, timer is not yet started; you have to call `timer?.resume()`
}

func startTimer() {
timer?.resume()
}

func pauseTiemr() {
timer?.suspend()
}

func stopTimer() {
timer?.cancel()
timer = nil
}

请注意,我并不是建议如果您想要suspendresume,您应该使用 GCD DispatchSourceTimer。根据需要调用 invalidate 并重新创建 Timer 非常简单,所以就这样做吧。为了完整起见,我仅提供此 GCD 信息。


顺便说一下,作为一般原则,永远不要在你的计时器处理程序中“增加”一些计数器。这是一个常见的错误。定时器不能保证每次都触发或精确触发。始终在开始时保存一些引用时间,然后在您的事件处理程序中,计算当前时间和开始时间之间的差异。例如,扩展我的 GCD 计时器示例:

func createTimer() {
timer = DispatchSource.makeTimerSource(queue: .main)
timer?.schedule(deadline: .now(), repeating: 0.1)

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .positional
formatter.allowedUnits = [.hour, .minute, .second, .nanosecond]
formatter.zeroFormattingBehavior = .pad

timer?.setEventHandler { [weak self] in
guard let start = self?.start else { return }
let elapsed = (self?.totalElapsed ?? 0) + CACurrentMediaTime() - start
self?.label.text = formatter.string(from: elapsed)
}
}

var start: CFTimeInterval? // if nil, timer not running
var totalElapsed: CFTimeInterval?

@objc func didTapButton(_ button: UIButton) {
if start == nil {
startTimer()
} else {
pauseTimer()
}
}

private func startTimer() {
start = CACurrentMediaTime()
timer?.resume()
}

private func pauseTimer() {
timer?.suspend()
totalElapsed = (totalElapsed ?? 0) + (CACurrentMediaTime() - start!)
start = nil
}

关于swift - 停止并重新启动计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46792661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com