当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Swift Optional.Publisher combineLatest(_:_:_:)用法及代码示例


用法一

实例方法

combineLatest(_:_:_:)

订阅另外三个发布者,并在接收到任何发布者的输出时发布一个元组。

声明

func combineLatest<P, Q, R>(
    _ publisher1: P,
    _ publisher2: Q,
    _ publisher3: R
) -> Publishers.CombineLatest4<Self, P, Q, R> where P : Publisher, Q : Publisher, R : Publisher, Self.Failure == P.Failure, P.Failure == Q.Failure, Q.Failure == R.Failure

返回值

一个从这个发布者和其他三个发布者接收和组合元素的发布者。

参数

publisher1

与第一个发布者合并的第二个发布者。

publisher2

第三个发布者与第一个发布者合并。

publisher3

与第一个发布者合并的第四个发布者。

详述

当您希望下游订阅者在其中任何一个发布值时从多个发布者接收最新元素的元组时,请使用 Publisher/combineLatest(_:_:_:)-48buc。要组合来自多个发布者的元素,请改用Publisher/zip(_:_:_:)-16rcy。要仅接收来自多个发布者而不是元组的最新元素,请使用 Publisher/merge(with:_:_:)

合并的发布者将所有请求传递给all 上游发布者。但是,它仍然遵循仅向下游发送请求量的demand-fulfilling 规则。如果需求不是 Subscribers/Demand/unlimited ,它会从上游发布者那里删除值。它通过为每个上游使用 1 的缓冲区大小来实现这一点,并在每个缓冲区中保存最新的值。

所有上游发布者都需要完成此发布者才能完成。如果上游发布者从不发布值,则此发布者永远不会完成。

在下面的示例中,Publisher/combineLatest(_:_:_:)-48buc 接收来自任何发布者的输入,将来自每个发布者的最新值组合成一个元组并发布它:


let pub = PassthroughSubject<Int, Never>()
let pub2 = PassthroughSubject<Int, Never>()
let pub3 = PassthroughSubject<Int, Never>()
let pub4 = PassthroughSubject<Int, Never>()


cancellable = pub
    .combineLatest(pub2, pub3, pub4)
    .sink { print("Result: \($0).") }


pub.send(1)
pub.send(2)
pub2.send(2)
pub3.send(9)
pub4.send(1)


pub.send(3)
pub2.send(12)
pub.send(13)
pub3.send(19)
//
// Prints:
//  Result: (2, 2, 9, 1).
//  Result: (3, 2, 9, 1).
//  Result: (3, 12, 9, 1).
//  Result: (13, 12, 9, 1).
//  Result: (13, 12, 19, 1).

如果组合集中的任何单个发布者因失败而终止,则该发布者也会失败。

可用版本

iOS 13.0+, iPadOS 13.0+, macOS 10.15+, Mac Catalyst 13.0+, tvOS 13.0+, watchOS 6.0+

用法二

实例方法

combineLatest(_:_:_:)

订阅另外两个发布者,并在接收到任何发布者的输出时调用闭包。

声明

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

返回值

一个从这个发布者和其他两个发布者接收和组合元素的发布者。

参数

publisher1

与第一个发布者合并的第二个发布者。

publisher2

第三个发布者与第一个发布者合并。

transform

从每个发布者接收最新值并返回要发布的新值的闭包。

详述

使用 combineLatest<P, Q>(_:,_:) 组合当前和两个附加发布者,并使用您指定的闭包转换它们以将新值发布到下游。

合并的发布者将所有请求传递给all 上游发布者。但是,它仍然遵循仅向下游发送请求量的demand-fulfilling 规则。如果需求不是 .unlimited ,它会从上游发布者那里删除值。它通过为每个上游使用 1 的缓冲区大小来实现这一点,并在每个缓冲区中保存最新的值。所有上游发布者都需要完成此发布者才能完成。如果上游发布者从不发布值,则此发布者永远不会完成。如果任何组合发布者因失败而终止,则此发布者也会失败。

在下面的示例中,combineLatest() 接收三个发布者发布的最新值,将它们相乘,然后重新发布结果:


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

可用版本

iOS 13.0+, iPadOS 13.0+, macOS 10.15+, Mac Catalyst 13.0+, tvOS 13.0+, watchOS 6.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Optional.Publisher combineLatest(_:_:_:)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。