merge(with:_:)
Combines elements from this publisher with those from two other publishers, delivering an interleaved sequence of elements.
Declaration
func merge<B, C>(with b: B, _ c: C) -> Publishers.Merge3<Self, B, C> where B : Publisher, C : Publisher, Self.Failure == B.Failure, Self.Output == B.Output, B.Failure == C.Failure, B.Output == C.OutputParameters
- b:
A second publisher.
- c:
A third publisher.
Return Value
A publisher that emits an event when any upstream publisher emits an event.
Discussion
Use merge(with:_:) when you want to receive a new element whenever any of the upstream publishers emits an element. To receive tuples of the most-recent value from all the upstream publishers whenever any of them emit a value, use combineLatest(_:_:). To combine elements from multiple upstream publishers, use zip(_:_:).
In this example, as merge(with:_:) receives input from the upstream publishers, it republishes the interleaved elements to the downstream:
let pubA = PassthroughSubject<Int, Never>()
let pubB = PassthroughSubject<Int, Never>()
let pubC = PassthroughSubject<Int, Never>()
cancellable = pubA
.merge(with: pubB, pubC)
.sink { print("\($0)", terminator: " " )}
pubA.send(1)
pubB.send(40)
pubC.send(90)
pubA.send(2)
pubB.send(50)
pubC.send(100)
// Prints: "1 40 90 2 50 100"The merged publisher continues to emit elements until all upstream publishers finish. If an upstream publisher produces an error, the merged publisher fails with that error.