cheduledTimer不会迅速停止另一个ViewController

时间:2019-12-15 03:59:37

标签: swift

我已经在视图控制器中设置了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转到另一个页面/视图控制器

2 个答案:

答案 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()
}

在其他一些自我声明方法中使计时器无效将无济于事,因为在某些情况下,未调用您的自我声明会导致计时器出现某些意外问题。