Contents

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.Failure

Parameters

  • 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

See Also

Collecting and republishing the latest elements from multiple publishers