Publisher — это начальная точка потока данных. По сути это объект, который создает какие-либо данные. Паблишером может быть любой объект, удовлетворяющий требованиям протокола Publisher, с двумя ассоциированными типами: Output и Failure.
Output (value) — это и есть генерируемые данные какого-либо типа (например, String).
Failure — это ошибка, которую может сгенерировать паблишер при неудачной операции. Она бывает двух типов: Error
и Never
, который используется в том случае, если мы уверены, что ошибка произойти не может.
public protocol Publisher<Output, Failure> {
associatedtype Output
associatedtype Failure: Error
}
Создадим первый паблишер на базе массива строк. Паблишер сам по себе бесполезен, если нет подписчика, ведь генерируемые данные надо как-то обработать.
let array = ["value1", "value2", "value3"]
let sequencePublisher = array.publisher
Например, если мы захотим вывести все данные, полученные от паблишера (элементы массива), то нам потребуется подписчик.
А теперь самое интересное — паблишеры можно разбить на разные категории в зависимости от критериев, по которым мы их делим.
- One-shot — отдают значение всего 1 раз и замолкают.
- Сontinuous broadcasting — отдают значения несколько раз в течение времени.
- Cold — будут смиренно ждать, пока на них кто-то подпишется, и только потом отправят событие.
- Hot — эгоистичные паблишеры. Им не важно, есть у них подписчики или нет. Если событие есть, они его отправят, даже если «на той стороне» некому слушать.
Combine | SwiftUI | Foundation |
---|---|---|
Result (one-shot, cold) | ObservableObject | publisher on KVO instance |
Just (one-shot, cold) | @Published | URLSession.dataTaskPublisher (one-shot, cold) |
Fail (one-shot, cold) | - | NotificationCenter (cb, hot) |
Sequence (cb, cold) | - | Timer (cb, hot/cold) |
Optional (one-shot, cold) | - | - |
Empty (one-shot, cold) | - | - |
Future (one-shot, hot) | - | - |
Deferred (one-shot, cold) | - | - |
Subject (cb, hot) | - | - |
4.1.4.1 Combine Theme | Back To iOSWiki Contents | 4.1.4.3 Convenience Publishers Theme