Выбор ответа Senior UIKit обновлено
Таймер останавливается при скролле
Вопрос
Таймер обратного отсчёта, созданный через Timer.scheduledTimer, замирает, пока пользователь скроллит таблицу. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: При скролле run loop в режиме .tracking, а таймер только в .default. Run loop обрабатывает источники только своего текущего режима. scheduledTimer регистрирует таймер в .default, а при отслеживании касаний скролла run loop переходит в UITrackingRunLoopMode.
Варианты ответа
- При скролле run loop в режиме
.tracking, а таймер только в.defaultправильный ответ - Таймеры не работают на главном потоке, пока он обрабатывает касания
- Скролл переводит приложение в состояние inactive, и таймеры замирают
- Таймер нужно создавать в
viewDidAppear, иначе он привязан к загрузке
Разбор
Run loop обрабатывает источники только своего текущего режима. scheduledTimer регистрирует таймер в .default, а при отслеживании касаний скролла run loop переходит в UITrackingRunLoopMode. RunLoop.main.add(timer, forMode: .common) добавляет таймер во все «общие» режимы, включая tracking. Приложение при скролле остаётся active, а место создания таймера на проблему не влияет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «UIKit»
- Неверная картинка в переиспользуемой ячейке
- Diffable data source и повторяющиеся идентификаторы
- Что делать в prepareForReuse
- reconfigureItems и reloadItems
- Ячейки с автоматической высотой
- Разница между frame и bounds
- Где брать финальный размер view
- Почему кнопка не получает нажатия