## Observer

Observer — это паттерн коммуникации, который используется в качестве уведомления объектов о том, что произошло какое-то событие и нужно на него как-то отреагировать.

Для реализации этого паттерна требуется всего 2 компонента:

* Паблишер (Publisher) — объект, публикующий какие-то данные, а точнее, уведомляющий об изменении данных;

* Подписчик (Subscriber) — объект, который подписывается на паблишера и следит за изменениями в данных для их последующей обработки.

В отличие от имеющихся подходов работы с асинхронными событиями ([делегаты](./Delegate.md), коллбэки и прочие), этот подход основан на потоках данных и распространении изменений с течением времени. 

**Поток данных** — это своего рода конвейер, по которому данные идут от паблишера к подписчику. В отличие от привычного @escaping closure, данные могут поступать порционно, а не один раз.

**Распространение изменений** — это уведомление всех подписчиков о том, что произошло с данными.

Под **течением времени** можно понимать упорядоченность изменений.

Данные, которые паблишер может отправить подписчикам, бывают трех видов: значения (например, Bool, String, массив, структура и другие), ошибки и сигнал о том, что паблишер закончил работу и больше ничего не пришлет.

Концепцию проще всего будет объяснить на примере аналогии с социальной сетью:

Допустим, какой-то блогер постоянно публикует контент (фотографии, истории и так далее). У него есть подписчики, которые следят за его публикациями и как-то на них реагируют (лайкают, комментируют или жалуются в техподдержку за оскорбительный пост).

Блогер — это **Publisher**. Он распространяет изменения (например, в аккаунте была одна фотография, теперь стало две).

Его контент — это **Values** и **Error**. Те самые данные, которые он распространяет с течением времени (вчера выложил одну фотографию, сегодня другую).

Его подписчики — это **Subscribers**. Они воспринимают («обрабатывают») полученные от блогера данные. Например, если пост понравился (валидные данные — **Values**), подписчики поставили лайки, а если пост не прошел модерацию (ошибка от сервера — **Error**), подписчики не увидят оскорбительный пост, а вместо него будет висеть баннер о том, что аккаунт заблокирован — это и есть сигнал о том, что **Publisher** больше ничего не опубликует.

![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/067/0b1/e70/0670b1e70ab5365edd605e1a6abce2bf.png)
