在invalidate()和nil之后,计时器保持工作

时间:2018-12-03 15:01:38

标签: ios swift timer nstimer

我有这个计时器:

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

我也有这种处理任务的方法:

 func dissmissAllTasks() {
    NotificationCenter.default.removeObserver(self)
    self.setCalibrationEnableTimer?.invalidate()
    self.setCalibrationEnableTimer = nil
    self.snapShotTimer?.invalidate()
    self.snapShotTimer = nil
    self.precentageTimer?.invalidate()
    self.precentageTimer = nil
}

当我逐步通过viewWillDisappear时会发生这种情况:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    dissmissAllTasks()
 }

但是当我转到其他VC时,我可以看到该计时器一直在运行。 我检查了调用的dissmissAllTask​​s(),然后看到计时器为零。

为什么计时器继续运行?

2 个答案:

答案 0 :(得分:1)

确保在同一线程中创建计时器并使计时器无效。

另外,您在闭包中还捕获了self,并且引用强烈,因此我相信对您的计时器的引用仍然有效。 您可以在0.1秒钟之内从服务器上收到一些重复的请求,而且您的所有请求似乎也很活跃。

答案 1 :(得分:1)

几乎可以肯定,您两次分配了precentageTimer而不使两者之间无效。这是一个非常常见的错误。在调用self.precentageTimer =之前,可能多次调用了包含viewWillDisappear的函数。由于您将其绑定到按钮按下,因此如果两次按下按钮,很可能会发生这种情况。

通常的解决方案是像这样向willSet添加一个percentageTimer(并且您不希望percentageTimer成为!;它绝对应该是{{1} },因为它可以合法地为nil):

?