## Операторы

[Полный список Publisher Operators от Apple](https://developer.apple.com/documentation/combine/publishers-merge-publisher-operators)

[Операторы с шариковыми диаграммами](https://tanaschita.com/20221121-cheatsheet-combine-operators/)

Zip, CombineLatest, Map, Filter with [interactive vizualization](https://rxmarbles.com/#combineLatest)

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


<details><summary>Последовательные операторы</summary>
<p>

* .first, .first(where:)
* .last, .last(where:)
* .output(at:), .output(in:)
* .count
* .contains, .contains(where:)
* .allSatisfy
* .reduce

</p>
</details>

<details><summary>Controlling Timing операторы</summary>
<p>

* delay - 
* debounce - операция фильтрации. При получении значения делается пауза в заданный интервал времени и отправляется последнее и __**единственное**__ значение. Если в заданный интервал приходит новое значение, то отсчет паузы возобновляется
![debounce](/pictures/Swift/debounce.jpeg?raw=true)
![debounce2](/pictures/Swift/debounce2.jpeg?raw=true)
    > Пример: Панель поиска, где пользователи могут вводить поисковые запросы. Если пользователь продолжает печатать в течение n периода, период ожидания возобновляется, гарантируя, что вызов API будет выполнен только после небольшой паузы в наборе текста.
* throttle - операция фильтрации. Cобирает несколько результатов с течением времени и отправляет один результат, но делает это с фиксированными временными окнами
![throttle](/pictures/Swift/throttle.jpeg?raw=true)
![throttle2](/pictures/Swift/throttle2.jpeg?raw=true)
    > Пример: Ккнопка, которую пользователи могут нажимать, вы хотите обрабатывать нажатия, но не допускать случайных множественных нажатий в быстрой последовательности. `throttle` гарантирует, что событие нажатия кнопки обрабатывается только один раз каждые 500 миллисекунд, независимо от того, сколько раз была нажата кнопка.
    
* measure interval -

</p>
</details>

<details><summary>Объединяющие операторы</summary>
<p>

* .prepend
* .append
* .switchToLatest
* .merge(with:)
* .combineLatest
* .zip

</p>
</details>



# TDB: 

Методы: 

`.receive(on: DispatchQueue.main)` - все, что влияет на UI, нужно делать в главном потоке. Вызывать перед `.sink`

`.setFailureType(to: Error.self)` - превращает `Publisher<Bool, Never>` в `Publisher<Bool, Error>`

`.eraseToAnyPublisher()` - чтобы был AnyPublisher<>, добавлять в конец

---

[4.1.4.3 Convenience Publishers Theme](./4.1.4.3%20ConveniencePublishers.md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [4.1.4.5 Subscriber Theme](./4.1.4.5%20Subscriber.md)