combineLatest(_:_:_:)
Subscribes to two additional publishers and invokes a closure upon receiving output from any of the publishers.
Declaration
func combineLatest<P, Q, T>(_ publisher1: P, _ publisher2: Q, _ transform: @escaping (Self.Output, P.Output, Q.Output) -> T) -> Publishers.Map<Publishers.CombineLatest3<Self, P, Q>, T> where P : Publisher, Q : Publisher, Self.Failure == P.Failure, P.Failure == Q.FailureParameters
- publisher1:
A second publisher to combine with the first publisher.
- publisher2:
A third publisher to combine with the first publisher.
- transform:
A closure that receives the most-recent value from each publisher and returns a new value to publish.
Return Value
A publisher that receives and combines elements from this publisher and two other publishers.
Discussion
Use combineLatest<P, Q>(_:,_:) to combine the current and two additional publishers and transform them using a closure you specify to publish a new value to the downstream.
The combined publisher passes through any requests to all upstream publishers. However, it still obeys the demand-fulfilling rule of only sending the request amount downstream. If the demand isn’t .unlimited, it drops values from upstream publishers. It implements this by using a buffer size of 1 for each upstream, and holds the most-recent value in each buffer. All upstream publishers need to finish for this publisher to finish. If an upstream publisher never publishes a value, this publisher never finishes. If any of the combined publishers terminates with a failure, this publisher also fails.
In the example below, combineLatest() receives the most-recent values published by three publishers, multiplies them together, and republishes the result:
let pub = PassthroughSubject<Int, Never>()
let pub2 = PassthroughSubject<Int, Never>()
let pub3 = PassthroughSubject<Int, Never>()
cancellable = pub
.combineLatest(pub2, pub3) { firstValue, secondValue, thirdValue in
return firstValue * secondValue * thirdValue
}
.sink { print("Result: \($0).") }
pub.send(1)
pub.send(2)
pub2.send(2)
pub3.send(10)
pub.send(9)
pub3.send(4)
pub2.send(12)
// Prints:
// Result: 40. // pub = 2, pub2 = 2, pub3 = 10
// Result: 180. // pub = 9, pub2 = 2, pub3 = 10
// Result: 72. // pub = 9, pub2 = 2, pub3 = 4
// Result: 432. // pub = 9, pub2 = 12, pub3 = 4