gpt4 book ai didi

Swift 定时器问题

转载 作者:行者123 更新时间:2023-12-01 11:19:14 33 4
gpt4 key购买 nike

我正在玩一个有很多轮的游戏,每一轮,计时器都会重置为零。这是我正确时的代码:

func correct() {
time = 10
timer()
//bla bla bla
}

这是定时器的代码:

func timer() {
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
self.time -= 1
if self.time > 0 {
self.timer()
} else {
self.dismissViewControllerAnimated(true, completion: nil)
}
}

}

我原以为计时器会重置为 10 并正常每秒滴答一次,但实际上它又回到了 10,而且倒数的速度非常快。例如,到第三轮时,它数到 10、9、7、6,每个数只持续约半秒。如果可能的话,你能告诉我如何解决吗?谢谢!

更新:显然,我的问题是我同时运行了多个计时器。我需要能够用新的计时器替换原来的计时器,或者至少停止原来的计时器。我已经搜索并找到了 .invalidate(),但我不确定如何使用它。如果那是我应该使用的方法,那么我应该如何使用它呢?谢谢!

最佳答案

有多种方法可以做您想做的事,使用 NSTimer 可能是最好的解决方案。您可以使用重复计时器(将在间隔后重复调用)或不重复计时器(您必须为每次迭代重新安排它)。

使用计时器而不是 dispatch_after 的好处是您可以轻松取消(使)计时器无效,从而避免计时器冲突。

使用定时器而不重复:

var timer: NSTimer?
var time: Int = 0

func correct() {
time = 10

//this will remove the previous timer
timer?.invalidate()
startTimer()
}

func startTimer() {
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "onTimerFired", userInfo: nil, repeats: false)
}

func onTimerFired() {
time -= 1

if self.time > 0 {
startTimer()
} else {
self.dismissViewControllerAnimated(true, completion: nil)
}
}

使用带重复功能的定时器:

var timer: NSTimer?
var time: Int = 0

func correct() {
time = 10

//this will remove the previous timer
timer?.invalidate()
startTimer()
}

func startTimer() {
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "onTimerFired", userInfo: nil, repeats: true)
}

func onTimerFired() {
time -= 1

if time == 0 {
//need to remove the timer here otherwise it would keep repeating
timer!.invalidate()
self.dismissViewControllerAnimated(true, completion: nil)
}
}

当然,你也可以只使用已经运行的定时器,只检查 timer != nil && timer!.valid 如果条件为真则不要启动新的定时器。

关于Swift 定时器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32681427/

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