> Что происходит с таймером, если он запущен в глобальной очереди, а не в главной в iOS (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Совкомбанк

Стек: iOS, Swift

> Пример ответа

Таймеры (Timer) в iOS тесно связаны с run loop, в котором они запущены. Если вы создаете таймер в глобальной очереди (например, DispatchQueue.global().async), он будет добавлен в run loop этой очереди. Однако важно понимать: глобальные очереди (concurrent queues) не имеют постоянного run loop по умолчанию. Run loop создается и уничтожается вместе с потоком, и в фоновых потоках он обычно не запущен.

В результате таймер может не сработать вовсе или сработать непредсказуемо, так как run loop не обрабатывает события. Чтобы таймер работал в фоновом потоке, нужно явно создать и запустить run loop (например, RunLoop.current.run()), а также убедиться, что поток остается активным. На практике это редко нужно - обычно таймеры запускают в главном потоке (main run loop) для обновления UI, либо используют DispatchSourceTimer для фоновых задач, который не зависит от run loop.

Пример неправильного использования:

SWIFT
DispatchQueue.global().async {
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
print("Таймер")
}
// Run loop не запущен - таймер не сработает
}

Правильный подход для фона - DispatchSourceTimer:

SWIFT
let timer = DispatchSource.makeTimerSource(queue: .global())
timer.schedule(deadline: .now(), repeating: 1)
timer.setEventHandler { print("Таймер") }
timer.resume()

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью