当应用程序进入前台时创建一个新的 Timer 实例?

问题描述 投票:0回答:2

我正在创建一个由用户设置计时器的应用程序。当应用程序进入后台时,

timer.invalidate()
。现在我希望当应用程序返回前台时计时器再次启动。我正在创建另一个计时器实例,以便在应用程序发送应用程序位于前台的通知时执行此操作。但是,它并没有触发该函数。

Viewdidload()
中,我正在创建一个计时器:

 timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(handleCountdown), userInfo: nil, repeats: true)
    RunLoop.current.add(self.timer!, forMode: RunLoop.Mode.common)

然后我收到通知,检查应用程序是在后台还是在前台:

当它进入后台时,我会使

timer
失效。

  @objc func applicationDidEnterBackground() {
    let defaults = UserDefaults.standard
    let quitTime = Date()
    defaults.set(quitTime, forKey: "quitTimeKey") //Storing the time of quit in UserDefaults
    timer?.invalidate()

}

当应用程序退出时,我首先检查

timer
是否有效,然后创建一个新的计时器。但这个定时器好像不起作用。

@objc func appEntersForeground() {
    calculateTimeLeft()
    if let timer = timer {
        if (!timer.isValid)
        {
            Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(handleCountdown), userInfo: nil, repeats: true)
        }
    }

}

这里的一些帮助将不胜感激!

ios swift timer elapsedtime
2个回答
1
投票

将您的

timer
属性声明为
weak
:

weak var timer: Timer?

则当

nil
无效时,将被设置为
timer
。 然后在创建新的之前检查
timer
是否为
nil

@objc func appEntersForeground() {
    calculateTimeLeft()
    if timer == nil {
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(handleCountdown), userInfo: nil, repeats: true)
    }
}

0
投票

您可能正在后台线程中创建时间,并且该线程可能已被终止。将计时器创建逻辑移至主线程。

© www.soinside.com 2019 - 2024. All rights reserved.