Skip to content

Latest commit

 

History

History
57 lines (39 loc) · 3.88 KB

4.1.4.2 Publishers.md

File metadata and controls

57 lines (39 loc) · 3.88 KB

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

Например, если мы захотим вывести все данные, полученные от паблишера (элементы массива), то нам потребуется подписчик.

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

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

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

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

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

  1. Cold — будут смиренно ждать, пока на них кто-то подпишется, и только потом отправят событие.
  2. 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