Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scheduledTimer未停止swift 5中的另一个ViewController_Swift - Fatal编程技术网

scheduledTimer未停止swift 5中的另一个ViewController

scheduledTimer未停止swift 5中的另一个ViewController,swift,Swift,我已在视图控制器中设置scheduledTimer。但当到达另一个视图控制器时,上一个视图控制器计时器将继续 var timer: Timer? = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(runTimedCode), userInfo: nil, repeats: false) 这里是函数 @objc func runTimedCode() { //Api Calling

我已在视图控制器中设置scheduledTimer。但当到达另一个视图控制器时,上一个视图控制器计时器将继续

var timer: Timer? = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(runTimedCode), userInfo: nil, repeats: false)
这里是函数

  @objc func runTimedCode() {
     //Api Calling


     }
当我转到另一个viewController时,上一个Api调用将继续。
请帮助我安排计时器转到另一页/viewcontroller

您可能没有在安装计时器的同一线程上调用invalidate。例如,如果在主线程上安装了,请在以下位置换行使无效:

DispatchQueue.main.async(execute: {

       self.timer.invalidate()

})

引用:

计时器保留对当前视图控制器的强引用,即使您的应用程序进入后台或非活动状态,但仍处于活动状态。此外,每当您按下新控制器时,计时器根本不会停止

即使你弹出你的控制器,它仍然不会在这一刻停止定时器。然而,若你们再次初始化定时器,定时器将以双倍速度启动。让我们了解这个问题

让我们有3个控制器

 HomeScreenVC --> TimerControllerVC --> NewVC 
TimerController
中初始化计时器时。它创建对TimerController的强引用。现在按一下某个动作方法上的
NewVC
控制器,此时计时器并没有停止,它仍在运行

如果将
TimerControllerVC
控制器弹出到
HomeScreenVC
,也会发生同样的情况。现在您再次按下
TimerControllerVC
,并用某种方法初始化新定时器。无论新创建的计时器如何,该计时器都将以2x的速度工作。如果你重复这个步骤,它会创造一个娱乐的循环

要解决计时器问题,请记住,无论何时声明计时器,都必须在UIViewcontroller的ViewWillDissAspect方法中使其无效

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
        timer.invalidate()
}

在某些其他自声明方法中使计时器无效将没有帮助,因为在某些情况下,不调用您的自声明将导致计时器出现意外问题。

只需调用
timer?.invalidate()
当你离开时。@Don我已经使用了它,但没有停止如果你在10秒内调用invalidate,计时器将不会启动。如果它已经被触发,并且您在移动到新的视图控制器时试图取消API调用,那么这就更复杂了。非常感谢您,但它无法覆盖func viewdiddefine(uu-animated:Bool){super.viewdiddefine(animated)timer!。invalidate()}尝试ViewWillEnglish。我尝试在ViewWillEnglishe中使计时器无效,但计时器仍在运行,无法停止。如果我缺少其他需要执行的操作,请您提供指导。设置timer=nil,请参阅timer creation and invaliding应在同一类中,以避免计时器的多个副本。