Ответ
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