简体   繁体   English

iOS Swift - 在#invalidate() 上阻止定时器#fire()

[英]iOS Swift - Prevent Timer #fire() on #invalidate()

Given the following code给定以下代码

private var myTimer: Timer? = nil

override func viewDidLoad() {
   super.viewDidLoad()
   // start my Timer
   startMyTimer()
   
   // stop timer and restart
   DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3)) {
      self.myTimer!.fire()
      print("my timer: invalidating \(Date.now.mediumTimeLocalizedDescription)")
      self.myTimer!.invalidate()
      self.myTimer = nil
      self.startMyTimer()
   }
}

private func startMyTimer() {
   myTimer = Timer.scheduledTimer(withTimeInterval: 10, repeats: true) { timer in
      print("my timer: Fired \(Date.now.mediumTimeLocalizedDescription)")
   }
   myTimer!.fire()
}

I get the following output:我得到以下 output:

my timer: Fired 14:27:14
my timer: Fired 14:27:17
my timer: invalidating 14:27:17
my timer: Fired 14:27:17
my timer: Fired 14:27:27

Expected output:预计 output:

my timer: Fired 14:27:14
my timer: Fired 14:27:17
my timer: invalidating 14:27:17
my timer: Fired 14:27:27

As you can see when I invalidate the timer fires right away!正如您所看到的,当我使计时器失效时立即触发!

Is there any way to prevent that?有什么办法可以防止这种情况发生吗?

I looked Apple documentation and it states "Stops the timer from ever firing again and requests its removal from its run loop."我查看了 Apple 文档,它指出“停止计时器再次触发并请求将其从运行循环中删除。” which I interpret as "When you invalidate, the timer does not fire anymore".我将其解释为“当您无效时,计时器不再触发”。 Am I wrong?我错了吗?

You call startMyTimer() again in DispatchQueue.main.asyncAfter completion.你在 DispatchQueue.main.asyncAfter 完成后再次调用 startMyTimer() 。 In this function you initialize timer.在此 function 中,您初始化计时器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM