Что такое режимы (modes) у Run Loop в iOS/macOS?

«Что такое режимы (modes) у Run Loop в iOS/macOS?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Режимы Run Loop — это механизм фильтрации, который определяет, какие источники событий (sources), таймеры (timers) и наблюдатели (observers) должны обрабатываться в текущей итерации цикла.

Основные режимы:

  • NSDefaultRunLoopMode (.default) — стандартный режим для большинства операций.
  • UITrackingRunLoopMode (.tracking) — активируется при взаимодействии с UI (скроллинг, перетаскивание). Таймеры, добавленные только в .default, в этом режиме не выполняются.
  • NSRunLoopCommonModes (.common) — не отдельный режим, а набор режимов (обычно включает .default и .tracking). Источники, добавленные в .common, работают во всех режимах этого набора.

Практический пример:

// Таймер, который будет работать даже во время скролла
let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
    print("Timer fired")
}
RunLoop.current.add(timer, forMode: .common)

Ключевой момент: Использование режимов позволяет приоритизировать обработку событий. Например, во время скролла UI остаётся отзывчивым, потому что Run Loop в режиме .tracking обрабатывает только события, связанные с отслеживанием. Для фоновых задач предпочтительнее использовать DispatchQueue или OperationQueue.