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

时间:2018-08-09 08:59:56

标签: ios swift timer elapsedtime

我正在创建一个应用,其中用户设置了计时器。当应用程序进入后台时,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是否为isValid,然后创建一个新计时器。但是此计时器似乎不起作用。

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

}

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

1 个答案:

答案 0 :(得分: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) } }

{{1}}