Для чего используется Signal в RxSwift?

«Для чего используется Signal в RxSwift?» — вопрос из категории Реактивное программирование, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Signal — это специализированный тип наблюдаемой последовательности в RxSwift, предназначенный для моделирования UI-событий. Его ключевые особенности:

  • Не может завершиться с ошибкой — никогда не эмитит событие .error, что критично для UI, где сбои должны обрабатываться иначе.
  • Гарантированная доставка на главном потоке — все события (.next, .completed) доставляются подписчику на MainScheduler.
  • Нет реиграния при подписке — как и Driver, не реиграет последнее событие новым подписчикам (является hot observable).

Практическое применение: Идеален для привязки действий пользователя (тапы, жесты) к реактивной логике.

// Создание Signal из UIControl
let buttonTapSignal: Signal<Void> = button.rx.tap.asSignal()

// Подписка
buttonTapSignal.emit(onNext: { [weak self] in
    self?.handleButtonTap()
})
// Ошибка компиляции: Signal не имеет метода `.catchError`
// buttonTapSignal.catchError(...) 

Отличие от Driver: Driver и Signal очень похожи (оба работают на главном потоке и не реиграют события). Основное различие — Driver предназначен для «состояния» (например, результат запроса для привязки к UILabel), а Signal — для «событий» (например, нажатия кнопки).