В чем разница между Cold Publisher и Hot Publisher в реактивном программировании?

«В чем разница между Cold Publisher и Hot Publisher в реактивном программировании?» — вопрос из категории Реактивное программирование, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Cold Publisher начинает генерировать события (эмитировать значения) только при появлении подписчика (subscriber). Каждый новый подписчик запускает независимую последовательность событий. Это ленивая (lazy) и индивидуальная стратегия.

Hot Publisher генерирует события независимо от наличия подписчиков и делит один поток событий между всеми текущими подписчиками. Подписчик, подключившийся позже, может пропустить ранее отправленные события.

Ключевые отличия:

  • Инициация: Cold — по подписке, Hot — независимо.
  • Данные: Cold — индивидуальный поток для каждого подписчика, Hot — общий (shared) поток.
  • Примеры в Combine: URLSession.dataTaskPublisher, Just, Future (обычно cold). PassthroughSubject, CurrentValueSubject, share() оператор (hot).

Пример Cold Publisher:

let coldPublisher = [1, 2, 3].publisher // Данные генерируются для каждого подписчика
let subscription1 = coldPublisher.sink { print("Sub1: ($0)") } // Печатает 1,2,3
let subscription2 = coldPublisher.sink { print("Sub2: ($0)") } // Снова печатает 1,2,3

Пример Hot Publisher:

let hotSubject = PassthroughSubject<Int, Never>()
// Отправляем до подписки — событие теряется
hotSubject.send(0)
// Подписываемся
let subscription1 = hotSubject.sink { print("Sub1: ($0)") }
hotSubject.send(1) // Sub1: 1
let subscription2 = hotSubject.sink { print("Sub2: ($0)") }
hotSubject.send(2) // Sub1: 2, Sub2: 2