What’s Combine?
A unified, declarative API for processing values over time.
Combine was designed for composition.
Key Concepts
Publisher
it’s a protocol
Declarative part of Combine.
Describes how values/errors are produced.
Sends (sequences of) values over time.
Two generic types:
OutputandErrorCompletion via
.finishedor.failurePublishers are not necessary who produced the value/error.
Subscriber
it’s a protocol
PublishercounterpartReceives values from publishers
Two generic types:
InputandErrorCan cancel a subscription
Subscription: A subscription is how aSubscribercontrols the flow of data from a Publisher to theSubscriber.
Operators
In-between
Publishers andSubscribers, they transform/filter the published value into something desired by the subscriberOperators forward errors, only change values.
They also manage scheduling/time, thread/queue movement, and more
Combine provides a lot of operators:catch, dropFirst, allSatisfy, breakpoint, setFailureType, prepend, replaceError, append, map, filter, count, abortOnError, breakpointOnError, ignoreOutput, first, min, last, output, prefix, replaceEmpty, compactMap, zip, flatMap, removeDuplicates, reduce, combineLatest, collect, retry, contains, switchToLatest, replaceNil, scan, and more!
The idea is that operators are composable:
instead of having a few operators that do a lot, Combine provides many operators that do a little, then it’s up to us to choose which operators to use based on our needs.
If a operator returns nil, it’s like stopping the event/value to proceed further. We can use most of the functional operators we’re used with arrays: prefix, compactMap, filter…
zip converts multiple inputs (from different publishers) into a single tuple. It requires all the inputs (from all upstreams) to be delivered before sending the data downstream. Therefore it acts as a when/and operation.
combineLatest is like zip, but it keeps the latest value of each upstream. Whenever a new value comes in, a new event is sent downstream with all old values except the new one.
Note that both zip and CombineLatest can transform the values into something else (no need to forward necessarily the tuple)
Future vs Publisher
If we need to represent a single value asynchronously, we have a future.
If we need to represent many values asynchronously, that’s a Publisher.
Future is a real type in combine
