Что такое run loop
Что проверяют
Понимаете ли вы, что это цикл обработки событий потока, и знаете ли, где он проявляется на практике.
Как отвечать
RunLoop это цикл, который держит поток живым и обрабатывает поступающие события: касания, таймеры, источники ввода, вызовы performSelector. Когда событий нет, поток засыпает, а не крутится вхолостую.
Главный поток имеет запущенный run loop по умолчанию, поэтому приложение реагирует на действия пользователя. У фонового потока его нет: чтобы там работали таймеры или источники ввода, run loop нужно получить и запустить самому.
Ключевое понятие это режимы. Run loop в каждый момент работает в одном режиме и обслуживает только источники, добавленные в этот режим:
defaultобычная работа;trackingдействует во время прокрутки;commonэто группа, включающая оба.
Отсюда классический эффект, который и просят объяснить: таймер, добавленный в режим по умолчанию, останавливается при прокрутке таблицы и продолжает работу после её окончания. Лечится добавлением в .common:
RunLoop.current.add(timer, forMode: .common)Что стоит добавить: Timer привязан к run loop, поэтому в фоновом потоке без запущенного цикла он не сработает; DispatchQueue и GCD с run loop не связаны, у них своя модель; в Swift Concurrency планированием занимается кооперативный пул, и run loop там напрямую не используется.
Где спотыкаются
Создают таймер в фоновом потоке и удивляются, что он не срабатывает.
Не знают про режимы и ловят остановку таймера при прокрутке.
Путают run loop с циклом событий из JavaScript: идея похожа, но это разные механизмы.
Считают, что GCD работает поверх run loop.