Создание нового экземпляра Timer, когда приложение выходит на передний план?

Я создаю приложение, в котором таймер установлен пользователем. Когда приложение переходит в фоновый режим, 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 ответ

Решение

Объявите свой 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)
    }
}
Другие вопросы по тегам