Расписание таймера отправки источника тайм-аут - PullRequest
0 голосов
/ 26 марта 2020

С помощью следующего кода Swift я пытаюсь создать задачу, которая запускается каждый час:

let queue: DispatchQueue = .main
let timer = DispatchSource.makeTimerSource(queue: queue)
timer.schedule(deadline: .now(), repeating: .seconds(3600), leeway: .milliseconds(100)
timer.setEventHandler { [weak self] in
    // run code
}

Теперь, когда у меня повторяющийся набор с меньшим числом, скажем, 10 или событие 150 секунд , он срабатывает, как и ожидалось, как на переднем, так и на заднем плане (или, точнее, после того, как передний план коснется его, срабатывает, если таймер отключился в фоновом режиме). Тем не менее, когда я пропускаю время ожидания приложения на экран блокировки и жду час, оно не отображается.

Есть ли какое-то время ожидания Apple для расписаний DispatchSource? Если так, то, что это? И есть ли способ изменить или обойти это?

Редактировать

Я не хочу специальных функций, когда это фон, я хочу, чтобы код продолжал работать как нормальный и для запуска обработчика события, когда происходит тайм-аут, даже если он находится в фоновом режиме

1 Ответ

0 голосов
/ 26 марта 2020

В итоге я принял предложение Мэтта и экономил время при каждом вызове кода, как показано ниже. Работало хорошо!

let timeOfLastCheck = Date()
let queue: DispatchQueue = .main
let timer = DispatchSource.makeTimerSource(queue: queue)
timer.schedule(deadline: .now(), repeating: .seconds(3600), leeway: .milliseconds(100)
timer.setEventHandler { [weak self] in
    timeOfLastCheck = Date()
    // run code
}

И в других местах, где таймер фактически создается:

    let notificationCenter: NotificationCenter = .default
    let activeNotificationToken = notificationCenter.addObserver(
        forName: UIApplication.didBecomeActiveNotification,
        object: nil,
        queue: nil
    ) { [weak self] _ in
        let now = Date()
        if let `self` = self,
           let timeInterval = TimeInterval(dispatchTimeInterval: self.interval), // TimeInterval is extended elsewhere to be able to take in a DispatchTimeInterval in the init
           now > timeOfLastCheck.addingTimeInterval(timeInterval) {
            self.timeOfLastCheck = Date()
            // run code
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...