Создание нового экземпляра 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)
}
}