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 时,我可以看到这个计时器一直在持续。我检查了调用的 dissmissAllTasks() ,我可以看到计时器为零。
为什么计时器一直走?
几乎可以肯定,您分配了precentageTimer两次,而中间没有使其无效。这是一个非常常见的错误。包含的函数可能在调用self.precentageTimer =之前被调用多次。viewWillDisappear由于您将其与按下按钮联系起来,因此如果按下按钮两次,则可能会发生这种情况。
willSet通常的解决方案是像这样添加 a percentageTimer(你不希望percentageTimer这样!;它绝对应该是?,因为它可以合法为零):
var precentageTimer: Timer? {
willSet {
percentageTimer?.invalidate()
}
}
Run Code Online (Sandbox Code Playgroud)