Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 仅在第一个计时器停止后重新启动计时器_Swift_Timer - Fatal编程技术网

Swift 仅在第一个计时器停止后重新启动计时器

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

我已经创建了自己的计时器类myTimer。我只想在第一个计时器停止时再次启动计时器。我该如何解决这个问题

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