Swift 仅在第一个计时器停止后重新启动计时器
我已经创建了自己的计时器类myTimer。我只想在第一个计时器停止时再次启动计时器。我该如何解决这个问题Swift 仅在第一个计时器停止后重新启动计时器,swift,timer,Swift,Timer,我已经创建了自己的计时器类myTimer。我只想在第一个计时器停止时再次启动计时器。我该如何解决这个问题 class myTimer{ var timer = Timer() var totalTime = 0 let score = Int(arc4random_uniform(100)) init() { } func start(){ timer.invalidate() timer = Timer.schedu
class myTimer{
var timer = Timer()
var totalTime = 0
let score = Int(arc4random_uniform(100))
init()
{
}
func start(){
timer.invalidate()
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerUpdate), userInfo: nil, repeats: true)
}
函数停止(){
你说:
我不希望它在前一个计时器运行时启动 您可以使用
guard
语句检查timer
是否为nil
或isValid
是否为false
:
func start() {
if timer?.isValid ?? false { return }
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timerUpdate), userInfo: nil, repeats: true)
}
“我只想在第一个计时器停止时再次启动计时器”…您正在停止计时器,但从未启动下一个计时器。您是在第一个计时器停止时自动启动下一个计时器,还是说如果您调用
start
,您不希望它在前一个计时器仍在运行时启动。顺便说一句,作为故障保护,我会确保start
不启动timer?.invalidate()
在启动计时器之前。这样你就不会有两个计时器同时运行。另外,我个人建议将计时器设置为弱变量,这样当它停止时,它会自动为你释放。你不需要保留对它的强引用,因为它所调度的运行循环将保留强引用,直到其无效。按照惯例,不相关的类型,如MyTimer
应以大写字母开头。类型名称(如struct
,class
,enum
等)应该总是以大写字母开头。只有变量名、枚举值等应该以小写字母开头。我不希望它在上一个计时器运行时开始。顺便说一句,我认为你修订的问题中的新代码在几个方面比你原来的代码更糟糕。显然,格式很难阅读。而且timer
实际上应该是一个可选的,计时器?
,而不是一个简单的计时器
,您可以用var Timer=Timer()
实例化为一个虚拟计时器。所有这些都与眼前的问题无关(但是,同样,您对代码段的更改也不相关)。我尝试了if Timer?.isValid??false{return}但即使前一个计时器正在运行,它仍在运行下一个计时器。我只希望运行一个计时器,当计时器停止时,新的计时器应开始运行。我建议打印timer?.isValid??false
。计时器运行时是否不打印true
?打印时为true(timer?.isValid??false)因此,如果它返回true
,那么它将在到达调度计时器的行之前返回
。但是您说它正在运行下一个计时器。因此我想知道问题是否是其他原因(例如,不是两个独立的计时器
,而是两个完全独立的MyTimer
实例)。请确保您只有一个MyTimer的实例。每次在视图控制器中按“后退”按钮时,我只创建一个MyTimer的实例。因此,我的目标是仅在上一个实例完成后创建一个新实例。让timer=MyTimer(),然后在“后退”按钮操作中创建timer.start()。
func start() {
if timer?.isValid ?? false { return }
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timerUpdate), userInfo: nil, repeats: true)
}