Выбор ответа Senior UIKit обновлено

Таймер останавливается при скролле

Вопрос

Таймер обратного отсчёта, созданный через Timer.scheduledTimer, замирает, пока пользователь скроллит таблицу. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: При скролле run loop в режиме .tracking, а таймер только в .default. Run loop обрабатывает источники только своего текущего режима. scheduledTimer регистрирует таймер в .default, а при отслеживании касаний скролла run loop переходит в UITrackingRunLoopMode.

Варианты ответа

  1. При скролле run loop в режиме .tracking, а таймер только в .defaultправильный ответ
  2. Таймеры не работают на главном потоке, пока он обрабатывает касания
  3. Скролл переводит приложение в состояние inactive, и таймеры замирают
  4. Таймер нужно создавать в viewDidAppear, иначе он привязан к загрузке

Разбор

Run loop обрабатывает источники только своего текущего режима. scheduledTimer регистрирует таймер в .default, а при отслеживании касаний скролла run loop переходит в UITrackingRunLoopMode. RunLoop.main.add(timer, forMode: .common) добавляет таймер во все «общие» режимы, включая tracking. Приложение при скролле остаётся active, а место создания таймера на проблему не влияет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.