Я изо всех сил пытаюсь понять ключевые различия между DispatchSourceTimer, Timer и asyncAfter (в моем случае для планирования задачи, которую нужно запускать каждые X секунд, хотя понимание различий в таймерах может быть полезно) (или есть другая (более эффективная) ) механизм планирования в Swift помимо перечисленных таймеров?).
Timer
нуждается в активном цикле выполнения в текущей очереди, в которой он был запущен. DispatchSourceTimer
не нуждается в этом. Timer
удерживает процессор от перехода в состояние ожидания. Это относится и к DispatchSourceTimer
/asyncAfter
?
В какой ситуации Timer
предпочтительнее, чем DispatchSourceTimer
/asyncAfter
? И, конечно, разница между всеми ними?
Я хочу планировать работу каждые 15 секунд в моем приложении в частной очереди. Это означает, что мне нужно использовать DispatchSourceTimer
потому что я нахожусь в очереди, которая не является основным потоком (или добавляю цикл выполнения в очередь и использую Timer
). Тем не менее, я не вижу никакой выгоды даже от использования Timer
в первую очередь. Может быть, есть другая операция, которую я могу использовать, чтобы этот график работал каждые X секунд в частной очереди, которая более эффективна, чем DispatchSourceTimer
, но я не нашел лучшего решения.
Является ли DispatchSourceTimer
более эффективным, чем Timer
? Или я должен пойти на метод с самостоятельным вызовом с asyncAfter
?
Это код для создания таймеров.
asyncAfter
DispatchQueue.global().asyncAfter(deadline: .now() + .seconds(2)) {
// Code
}
таймер
Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { (_) in
// Code
}
DispatchSourceTimer
let timer = DispatchSource.makeTimerSource()
timer.schedule(deadline: .now() + .seconds(1))
timer.setEventHandler {
// Code
}
timer.activate()
Каковы минусы и плюсы всех таймеров? Когда я должен использовать один над другим? Какой таймер наиболее эффективен? Я придумал следующее:
таймер
Плюсы:
- Может быть признан недействительным
- Ссылка не требуется
- Может быть остановлено, пока это запланировано.
Минусы:
- Предотвращает процессор для простоя
- Необходимо запустить в очереди с циклом выполнения (иначе ничего не происходит, даже нет триггера подтверждения...)
DispatchSourceTimer
Плюсы:
- Может быть отменено
- Не требуется цикл выполнения
Минусы:
- Нужна сильная ссылка, иначе он будет немедленно освобожден
asyncAfter
Плюсы: - Не требуется цикл запуска
Минусы: - отменить нельзя (я думаю)
Есть ли еще таймеры? Почему так много таймеров? Я ожидал реальной разницы между таймерами, но не смог их найти.
Здесь много вопросов, как вы можете прочитать. Главный вопрос: какие таймеры доступны и какие таймеры следует использовать в каком случае и почему?