# Publisher

Publisher는 시간이 지남에 따라 값의 시퀀스를 전달할 수 있다.

Combine에서 `Publisher`는 프로토콜로 정의되어 있으며, 다음의 타입이 이 프로토콜을 채택한다.

* `Publishers` 열거형의 중첩 타입으로 정의된 여러 구조체
* `Just`, `Empty`와 같은 Convenience Publisher
* 타입을 지운 Publisher인 `AnyPublisher` 구조체
* 등등

두 개의 연관 타입이 정의되어 있다.

* 첫 번째 연관 타입은 값의 타입(`Output`)이다.
* 두 번째 연관 타입은 에러의 타입(`Failure`)이다.&#x20;
  * 에러의 타입은 `Error` 프로토콜을 채택해야 한다.

`Publisher` 프로토콜의 익스텐션으로 여러 오퍼레이터*operator*가 정의되어 있으며, 이를 사용해서 이벤트 처리 체인을 구성할 수 있다.

각 오퍼레이터는 `Publisher` 프로토콜을 구현하는 타입을 반환한다.

기본적으로 `Publisher` 프로토콜은 오퍼레이터의 이름과 그것이 반환하는 Publisher의 이름을 비슷하게 만들어 두었으나, 이 프로토콜을 채택하는 개별 Publisher는 오퍼레이터가 다른 타입의 Publisher를 반환하게 구현해둘 수 있다.

```swift
protocol Publisher { }

extension Publisher {
  func count() -> Publishers.Count<Self>
}

struct Just: Publisher {
  func count() -> Just<Int>
}
```

`Publisher` 프로토콜의 익스텐션으로 여러 오퍼레이터가 구현되어 있으나, `Just`와 같은 개별 Publisher가 오퍼레이터를 오버로딩하여 다른 타입을 반환하도록 구현한 경우를 어렵지 않게 찾아볼 수 있다.

## RxSwift

일반적으로 `Publisher` 프로토콜을 구현하는 타입은 RxSwift의 `Observable`과 비교 가능하다.

에러 연관 타입이 `Never`로 에러 값을 전달하지 않는다는 것이 보장되는 것은 RxCocoa의 `Driver`와 비교 가능하다.

하나의 값을 전달하고 종료하거나, 에러를 내고 종료하는 `Single`의 동작은 Combine의 `Future` Publisher를 사용하여 구현할 수 있다.

`Completable`, `Maybe`와 같은 RxSwift의 Traits는 Combine에 별도의 타입으로 구현되어 있지 않다.

## ReactiveSwift

일반적으로 `Publisher` 프로토콜을 구현하는 타입은 ReactiveSwift의 `SignalProducer`와 `Signal`과 비교 가능하다.

`SignalProducer`는 'Cold Observable', `Signal`은 'Hot Observable'을 의미하는데, Combine에서는 이 동작을 별도의 타입으로 구분하지 않는다.

## Publisher와 Operator 쌍

### Convenience Publishers

| Publisher                                                                                | 관련 Operator |
| ---------------------------------------------------------------------------------------- | ----------- |
| [Future](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/future)     | -           |
| [Just](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/just)         | -           |
| [Deferred](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/deferred) | -           |
| [Empty](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/empty)       | -           |
| [Fail](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/fail)         | -           |
| Record                                                                                   | -           |

### Publisher in Publishers Enum

#### Convenience Publishers

| Publisher                                                                                | 관련 Operator |
| ---------------------------------------------------------------------------------------- | ----------- |
| [Sequence](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/sequence) | -           |
| [Catch](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/catch)       | `catch`     |

#### Working with Subscribers

| Publisher                                                                                      | 관련 Operator |
| ---------------------------------------------------------------------------------------------- | ----------- |
| [ReceiveOn](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/receiveon)     | `receive`   |
| [SubscribeOn](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/subscribeon) | `subscribe` |

#### Mapping Elements

| Publisher                                                                                            | 관련 Operator                                    |
| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------- |
| [TryScan](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/tryscan)               | `tryScan`                                      |
| [TryMap](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/trymap)                 | `tryMap`                                       |
| FlatMap                                                                                              | `flatMap`                                      |
| [Map](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/map)                       | `map` / `replaceNil` / `combineLatest` / `zip` |
| [MapError](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/maperror)             | `mapError`                                     |
| [Scan](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/scan)                     | `scan`                                         |
| [SetFailureType](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/setfailuretype) | `setFailureType`                               |

#### Filtering Elements

| Publisher                                                                                                      | 관련 Operator           |
| -------------------------------------------------------------------------------------------------------------- | --------------------- |
| [CompactMap](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/compactmap)                   | `compactMap`          |
| [Filter](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/filter)                           | `filter`              |
| [RemoveDuplicates](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/removeduplicates)       | `removeDuplicates`    |
| [ReplaceEmpty](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/replaceempty)               | `replaceEmpty`        |
| [ReplaceError](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/replaceerror)               | `replaceError`        |
| [TryCompactMap](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/trycompactmap)             | `tryCompactMap`       |
| [TryFilter](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/tryfilter)                     | `tryFilter`           |
| [TryRemoveDuplicates](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/tryremoveduplicates) | `tryRemoveDuplicates` |

#### Reducing Elements

| Publisher                                                                                                                                    | 관련 Operator    |
| -------------------------------------------------------------------------------------------------------------------------------------------- | -------------- |
| [Collect](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/collect)                                                       | `collect`      |
| [CollectByCount](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/collectbycount)                                         | `collect`      |
| [CollectByTime](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/collectbytime)                                           | `collect`      |
| [IgnoreOutput](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/ignoreoutput)                                             | `ignoreOutput` |
| [Reduce](https://github.com/presto95/Combine-RxSwift-ReactiveSwift/tree/a9a4a8aa03a4a3e56527cbbe7168b6c19ab16ebb/Publisher/Reduce/README.md) | `reduce`       |
| [TryReduce](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/tryreduce)                                                   | `tryReduce`    |

#### Applying Mathematical Operations on Elements

| Publisher                                                                                          | 관련 Operator         |
| -------------------------------------------------------------------------------------------------- | ------------------- |
| [Comparison](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/comparison)       | `max` / `min`       |
| [TryComparison](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/trycomparison) | `tryMax` / `tryMin` |
| [Count](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/count)                 | `count`             |

#### Applying Matching Criteria to Elements

| Publisher                                                                                                | 관련 Operator     |
| -------------------------------------------------------------------------------------------------------- | --------------- |
| [TryAllSatisfy](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/tryallsatisfy)       | `tryAllSatisfy` |
| [AllSatisfy](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/allsatisfy)             | `allSatisfy`    |
| [Contains](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/contains)                 | `contains`      |
| [ContainsWhere](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/containswhere)       | `contains`      |
| [TryContainsWhere](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/trycontainswhere) | `tryContains`   |

#### Applying Sequence Operations to Elements

| Publisher                                                                                                                                             | 관련 Operator          |
| ----------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
| [FirstWhere](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/firstwhere)                                                          | `first`              |
| [LastWhere](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/lastwhere)                                                            | `last`               |
| [DropUntilOutput](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/dropuntiloutput)                                                | `drop`               |
| [DropWhile](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/dropwhile)                                                            | `drop`               |
| [TryDropWhile](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/trydropwhile)                                                      | `tryDrop`            |
| [Concatenate](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/concatenate)                                                        | `append` / `prepend` |
| [Drop](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/drop)                                                                      | `dropFirst`          |
| [PrefixUntilOutput](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/prefixuntiloutput)                                            | `prefix`             |
| [PrefixWhile](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/prefixwhile)                                                        | `prefix`             |
| [First](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/first)                                                                    | `first`              |
| [Last](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/last)                                                                      | `last`               |
| [TryFirstWhere](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/tryfirstwhere)                                                    | `tryFirst`           |
| [TryLastWhere](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/trylastwhere)                                                      | `tryLast`            |
| [TryPrefixWhile](https://github.com/presto95/Combine-RxSwift-ReactiveSwift/tree/a9a4a8aa03a4a3e56527cbbe7168b6c19ab16ebb/Publisher/TryPrefixWhere.md) | `tryPrefix`          |
| [Output](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/output)                                                                  | `output`             |

#### Combining Elements from Multiple Publishers

| Publisher                                                                                            | 관련 Operator     |
| ---------------------------------------------------------------------------------------------------- | --------------- |
| [CombineLatest](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/combinelatest)   | `combineLatest` |
| [CombineLatest3](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/combinelatest3) | `combineLatest` |
| [CombineLatest4](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/combinelatest4) | `combineLatest` |
| [Merge](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/merge)                   | `merge`         |
| [Merge3](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/merge3)                 | `merge`         |
| [Merge4](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/merge4)                 | `merge`         |
| [Merge5](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/merge5)                 | `merge`         |
| [Merge6](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/merge6)                 | `merge`         |
| [Merge7](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/merge7)                 | `merge`         |
| [Merge8](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/merge8)                 | `merge`         |
| [MergeMany](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/mergemany)           | `merge`         |
| [Zip](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/zip)                       | `zip`           |
| [Zip3](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/zip3)                     | `zip`           |
| [Zip4](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/zip4)                     | `zip`           |

#### Handling Errors

| Publisher                                                                                              | 관련 Operator       |
| ------------------------------------------------------------------------------------------------------ | ----------------- |
| [AssertNoFailure](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/assertnofailure) | `assertNoFailure` |
| [Catch](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/catch)                     | `catch`           |
| [TryCatch](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/trycatch)               | `tryCatch`        |
| [Retry](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/retry)                     | `retry`           |

#### Adapting Publisher Types

| Publisher                                                                                            | 관련 Operator      |
| ---------------------------------------------------------------------------------------------------- | ---------------- |
| [SwitchToLatest](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/switchtolatest) | `switchToLatest` |

#### Controlling Timing

| Publisher                                                                                              | 관련 Operator       |
| ------------------------------------------------------------------------------------------------------ | ----------------- |
| [Debounce](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/debounce)               | `debounce`        |
| [Delay](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/delay)                     | `delay`           |
| [MeasureInterval](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/measureinterval) | `measureInterval` |
| [Throttle](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/throttle)               | `throttle`        |
| [Timeout](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/timeout)                 | `timeout`         |

#### Creating Reference-type Publishers

| Publisher | 관련 Operator |
| --------- | ----------- |
| Share     | `share`     |

#### Encoding and Decoding

| Publisher                                                                            | 관련 Operator |
| ------------------------------------------------------------------------------------ | ----------- |
| [Encode](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/encode) | `encode`    |
| [Decode](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/decode) | `decode`    |

#### Identifying Properties with Key Paths

| Publisher                                                                                      | 관련 Operator |
| ---------------------------------------------------------------------------------------------- | ----------- |
| [MapKeyPath](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/mapkeypath)   | `map`       |
| [MapKeyPath2](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/mapkeypath2) | `map`       |
| [MapKeyPath3](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/mapkeypath3) | `map`       |

#### Using Explicit Publisher Connections

| Publisher   | 관련 Operator   |
| ----------- | ------------- |
| Autoconnect | `autoconnect` |

#### Working with Multiple Subscribers

| Publisher | 관련 Operator |
| --------- | ----------- |
| Multicast | `multicast` |

#### Buffering Elements

| Publisher | 관련 Operator |
| --------- | ----------- |
| Buffer    | `buffer`    |

#### Adding Explicit Connectability

| Publisher       | 관련 Operator       |
| --------------- | ----------------- |
| MakeConnectable | `makeConnectable` |

#### Debugging

| Publisher                                                                                        | 관련 Operator                        |
| ------------------------------------------------------------------------------------------------ | ---------------------------------- |
| [Breakpoint](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/breakpoint)     | `breakpoint` / `breakpointOnError` |
| [HandleEvents](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/handleevents) | `handleEvents`                     |
| [Print](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/print)               | `print`                            |

### Misc.

| Publisher                                                                                                                        | 관련 Operator           |
| -------------------------------------------------------------------------------------------------------------------------------- | --------------------- |
| [AnyPublisher](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/anypublisher)                                 | `eraseToAnyPublisher` |
| NotificationCenter.Publisher                                                                                                     | -                     |
| [Optional.Publisher](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/optional.publisher)                     | -                     |
| [Result.Publisher](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/result.publisher)                         | -                     |
| [URLSession.DataTaskPublisher](https://presto95.gitbook.io/combine-rxswift-reactiveswift/publisher/urlsession.datataskpublisher) | -                     |
| Timer.TimerPublisher                                                                                                             | -                     |
