我有这个计时器:
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时,我可以看到该计时器一直在运行。 我检查了调用的dissmissAllTasks(),然后看到计时器为零。
为什么计时器继续运行?
答案 0 :(得分:1)
确保在同一线程中创建计时器并使计时器无效。
另外,您在闭包中还捕获了self
,并且引用强烈,因此我相信对您的计时器的引用仍然有效。
您可以在0.1秒钟之内从服务器上收到一些重复的请求,而且您的所有请求似乎也很活跃。
答案 1 :(得分:1)
几乎可以肯定,您两次分配了precentageTimer
而不使两者之间无效。这是一个非常常见的错误。在调用self.precentageTimer =
之前,可能多次调用了包含viewWillDisappear
的函数。由于您将其绑定到按钮按下,因此如果两次按下按钮,很可能会发生这种情况。
通常的解决方案是像这样向willSet
添加一个percentageTimer
(并且您不希望percentageTimer
成为!
;它绝对应该是{{1} },因为它可以合法地为nil):
?