## [Publisher](https://developer.apple.com/documentation/combine/publisher)

![Combine](/pictures/Swift/Combine.jpg?raw=true)

**Publisher** — это начальная точка потока данных. По сути это объект, который создает какие-либо данные. Паблишером может быть любой объект, удовлетворяющий требованиям протокола Publisher, с двумя ассоциированными типами: Output и Failure.

**Output (value)** — это и есть генерируемые данные какого-либо типа (например, String). 

**Failure** — это ошибка, которую может сгенерировать паблишер при неудачной операции. Она бывает двух типов: `Error` и `Never`, который используется в том случае, если мы уверены, что ошибка произойти не может.

```swift
public protocol Publisher<Output, Failure> {
    associatedtype Output
    associatedtype Failure: Error
}
```

Создадим первый паблишер на базе массива строк. Паблишер сам по себе бесполезен, если нет подписчика, ведь генерируемые данные надо как-то обработать.

```swift
let array = ["value1", "value2", "value3"]
let sequencePublisher = array.publisher
```

Например, если мы захотим вывести все данные, полученные от паблишера (элементы массива), то нам потребуется [подписчик](./4.1.4.5%20Subscriber.md).

### Какие есть паблишеры в Combine

А теперь самое интересное — паблишеры можно разбить на разные категории в зависимости от критериев, по которым мы их делим.

#### По эмиту событий

1. One-shot — отдают значение всего 1 раз и замолкают.
2. Сontinuous broadcasting — отдают значения несколько раз в течение времени.

#### По реакции на подписку

1. Cold — будут смиренно ждать, пока на них кто-то подпишется, и только потом отправят событие.
2. Hot — эгоистичные паблишеры. Им не важно, есть у них подписчики или нет. Если событие есть, они его отправят, даже если «на той стороне» некому слушать.

### По типу данных

| Combine | SwiftUI | Foundation |
|---|---|---|
| [Result (one-shot, cold)](https://heckj.github.io/swiftui-notes/#reference-result) | ObservableObject | [publisher on KVO instance](https://heckj.github.io/swiftui-notes/#reference-kvo-publisher) |
| Just (one-shot, cold) | [@Published](https://www.swiftbysundell.com/articles/published-properties-in-swift/) | [URLSession.dataTaskPublisher (one-shot, cold)](https://heckj.github.io/swiftui-notes/#reference-datataskpublisher) |
| Fail (one-shot, cold) | - | [NotificationCenter (cb, hot)](https://heckj.github.io/swiftui-notes/#reference-notificationcenter) |
| Sequence (cb, cold) | - | [Timer (cb, hot/cold)](https://heckj.github.io/swiftui-notes/#reference-timer) |
| 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](./4.1.4.1%20Combine.md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [4.1.4.3 Convenience Publishers Theme](./4.1.4.3%20ConveniencePublishers.md)