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

iro*_*oei -1 timer nstimer ios swift

我有这个计时器:

class InstallationViewController: BaseViewController {

   var precentageTimer: Timer!
}
Run Code Online (Sandbox Code Playgroud)

在同一堂课中,我像这样启动计时器:

               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)
                })
            })
Run Code Online (Sandbox Code Playgroud)

我也有这样的方法来解除任务:

 func dissmissAllTasks() {
    NotificationCenter.default.removeObserver(self)
    self.setCalibrationEnableTimer?.invalidate()
    self.setCalibrationEnableTimer = nil
    self.snapShotTimer?.invalidate()
    self.snapShotTimer = nil
    self.precentageTimer?.invalidate()
    self.precentageTimer = nil
}
Run Code Online (Sandbox Code Playgroud)

当我像这样单步执行 viewWillDisappear 时就会发生这种情况:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    dissmissAllTasks()
 }
Run Code Online (Sandbox Code Playgroud)

但当我去其他 VC 时,我可以看到这个计时器一直在持续。我检查了调用的 dissmissAllTask​​s() ,我可以看到计时器为零。

为什么计时器一直走?

Rob*_*ier 5

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

willSet通常的解决方案是像这样添加 a percentageTimer(你不希望percentageTimer这样!;它绝对应该是?,因为它可以合法为零):

var precentageTimer: Timer? {
    willSet {
        percentageTimer?.invalidate()
    }
}
Run Code Online (Sandbox Code Playgroud)