> Как работает таймер в iOS и с чем связана его работа (iOS, Swift)

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

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

Стек: iOS, Swift

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

Таймеры в iOS реализуются через класс Timer (или DispatchSourceTimer для более низкоуровневого контроля). Основной механизм работы таймера связан с RunLoop - циклом обработки событий, который управляет выполнением задач в главном потоке. Когда вы создаете Timer, он добавляется в определенный RunLoop (например, .default для главного потока) и срабатывает в соответствии с заданным интервалом, но только если RunLoop активен и не заблокирован другими задачами.

Ключевые аспекты:

  • RunLoop: Таймер не гарантирует точное время срабатывания, так как RunLoop может быть занят обработкой других событий (например, анимаций или ввода пользователя). Если RunLoop заблокирован, срабатывание таймера откладывается.

  • Точность: Для высокоточных таймеров (например, в играх) лучше использовать CADisplayLink (синхронизирован с частотой обновления экрана) или DispatchSourceTimer с флагом .strict - они работают вне RunLoop, через GCD, и обеспечивают более предсказуемое выполнение.

  • Утечки памяти: Таймер удерживает сильную ссылку на цель (target), что может привести к циклическим ссылкам, если цель удерживает таймер. Рекомендуется использовать блоки (closures) с [weak self] или инвалидировать таймер в deinit.

  • Фоновый режим: В фоне таймеры на главном RunLoop приостанавливаются. Для фоновых задач используйте Background Tasks или DispatchSourceTimer с отдельной очередью.

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

SWIFT
var timer: Timer?
func startTimer() {
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
// выполняется в главном потоке
}
}
func stopTimer() {
timer?.invalidate()
timer = nil
}

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

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