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

标签 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)
        }
    }

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

最佳答案

将您的 timer 属性声明为 weak:

weak var timer: Timer?

然后当timer失效时,它会被设置为nil。然后在创建新计时器之前检查 timer 是否为 nil:

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

关于ios - 当应用程序进入前台时创建一个新的 Timer 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51762833/

相关文章:

java - ScheduledExecutorService.scheduleAtFixedRate 并将 initialDelay 设置为过去的日期

ios - 如何存储两个对象的数组

ios - 苹果手机SDK : how to distinguish between touch and drag

ios - RestKit请求映射-发布对象数组

ios - Xcode 10. 您的帐户没有创建 iOS App Store 配置文件的权限

swift 3;照片未保存到照片库

arrays - 有没有一种简单的方法来计算两个数组之间的差异

ios - 自定义 UIButton 的边缘在与其交互后看起来像素化

android - 在 Android 中每秒更新一次 TextView

C# timer - 安排对接受参数的函数的调用