Ios 计时器在invalidate()和nil之后继续工作

Ios 计时器在invalidate()和nil之后继续工作,ios,swift,timer,nstimer,Ios,Swift,Timer,Nstimer,我有一个计时器: class InstallationViewController: BaseViewController { var precentageTimer: Timer! } 在同一节课上,我启动计时器的方式如下: self.precentageTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { (timer) in

我有一个计时器:

class InstallationViewController: BaseViewController {

   var precentageTimer: Timer!
}
在同一节课上,我启动计时器的方式如下:

               self.precentageTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { (timer) in
                self.network.getClibrationPercentage(success: { (info, percent) in
                    self.isAnalysisCompleted(percent: percent)
                    self.precentageLbl.text = "\(percent)%"
                    self.instructionsLbl.text = info
                    self.precentageLbl.isHidden = false
                }, failure: { (error) in
                    print(error)
                })
            })
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    dissmissAllTasks()
 }
我也有这样的任务分解方法:

 func dissmissAllTasks() {
    NotificationCenter.default.removeObserver(self)
    self.setCalibrationEnableTimer?.invalidate()
    self.setCalibrationEnableTimer = nil
    self.snapShotTimer?.invalidate()
    self.snapShotTimer = nil
    self.precentageTimer?.invalidate()
    self.precentageTimer = nil
}
当我在视图中单步执行时,会发生如下情况:

               self.precentageTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { (timer) in
                self.network.getClibrationPercentage(success: { (info, percent) in
                    self.isAnalysisCompleted(percent: percent)
                    self.precentageLbl.text = "\(percent)%"
                    self.instructionsLbl.text = info
                    self.precentageLbl.isHidden = false
                }, failure: { (error) in
                    print(error)
                })
            })
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    dissmissAllTasks()
 }
但当我去其他VC的时候,我可以看到这个计时器一直在运行。 我已经检查了调用的dissmissAllTasks(),可以看到计时器为零


为什么计时器持续运行?

确保在同一线程中创建并使计时器无效。 此外,您在闭包中捕获了带有强引用的
self
,因此我相信对计时器的引用仍然有效。
您可以在0.1秒内通过重复从服务器上获得一些信息,并且您的所有请求似乎也都处于活动状态。

您几乎可以肯定会分配两次
precentageTimer
,而不会在其间使其失效。这是一个非常常见的错误。包含
self.precentageTimer=
的函数可能在调用
viewwilldesign
之前被多次调用。因为你把它绑在一个按钮上,如果按钮被按下两次,很可能会发生这种情况

通常的解决方案是像这样将
willSet
添加到
percentageTimer
(您不希望
percentageTimer
成为
;它绝对应该是
,因为它可以合法地为零):


调度计时器的代码在哪个函数中?也许您多次调用它并创建了多个计时器。@rmaddy当按下按钮时,前一个计时器开始,这是我唯一调用它的地方。按钮可以按下3次,但每次更改标记时,该方法都会被调用一次。当VC加载时,将设置为无效?这有什么用?我不知道这是什么意思。您指的是哪一个“标记”,以及您所说的“一次调用的方法”是什么意思?我确信您在失效之前多次调用这一行代码,或者您拥有视图控制器的多个副本。考虑到你的症状,这是经常发生的两个原因。在赋值行上放置一个断点,看看它是否在计时器已经设置好时被调用。这就是我所做的。。。由于计时器配置(如我所愿),该行被调用一次并重复,这就是您的建议吗self.precentageTimer=Timer.scheduledTimer(withTimeInterval:0.1,repeats:true,block:{[weak self](Timer)在self?.network.getClibrationPercentage(success:{(info,percent))在self?中。isAnalysisCompleted(percent:percent)self?.precentageLbl.text=“(percent)%”)self?.instructionsLbl.text=info self?.precentageLbl.ishiden=false我相信它应该会起作用,但在我看来,它是关于线的。我所做的软弱的自我是你在想什么?不仅是事情,而且是的。我对你的评论有点困惑。如果这对你没有帮助,那就做吧假设你在同一个线程中创建并使计时器无效,看看Rob Napier的答案-它似乎对你有帮助。