我已经在视图控制器中设置了scheduleTimer。但是到花药视图控制器时,先前的视图控制器计时器仍在继续。这是我的代码
var timer: Timer? = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(runTimedCode), userInfo: nil, repeats: false)
这是功能
@objc func runTimedCode() {
//Api Calling
}
当我转到另一个viewController时,先前的Api调用将继续。 请帮我让ScheduledTimer转到另一个页面/视图控制器
答案 0 :(得分:1)
您可能没有在安装计时器的同一线程上调用 invalidate 。例如,如果您安装在主线程上,则将 invalidate 包裹在以下内容中:
DispatchQueue.main.async(execute: {
self.timer.invalidate()
})
参考:https://developer.apple.com/documentation/foundation/timer/1415405-invalidate
答案 1 :(得分:0)
即使您的应用进入后台或非活动状态,计时器仍对当前视图控制器保持强烈引用。同样,无论何时按下新的控制器,计时器都不会停止。
即使您弹出控制器,它现在仍不会停止计时器。但是,如果再次初始化计时器,计时器将以双倍速度启动。让我们了解这个问题。
让我们拥有3个控制器
HomeScreenVC --> TimerControllerVC --> NewVC
在TimerController
中初始化计时器时。它为您的TimerController创建了强大的参考。现在,将NewVC
控制器推入某种操作方法,此时计时器仍在运行,但尚未停止。
如果将TimerControllerVC
控制器弹出到HomeScreenVC
,也会发生同样的情况。现在,您再次按某种方法推TimerControllerVC
并初始化新计时器。不论新创建的计时器是什么,此计时器都可以以 2x 的速度工作。如果您重复此步骤,则会创建一个娱乐周期。
解决计时器问题,请记住,每当声明计时器时,都必须在UIViewcontroller的viewwilldissappear方法中使其无效。
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
timer.invalidate()
}
在其他一些自我声明方法中使计时器无效将无济于事,因为在某些情况下,未调用您的自我声明会导致计时器出现某些意外问题。