实例方法
combine
combineLatest(_:_:_:_:)
订阅另外三个发布者,并在接收到任何发布者的输出时调用闭包。
声明
func combineLatest<P, Q, R, T>(
_ publisher1: P,
_ publisher2: Q,
_ publisher3: R,
_ transform: @escaping (Self.Output, P.Output, Q.Output, R.Output) -> T
) -> Publishers.Map<Publishers.CombineLatest4<Self, P, Q, R>, T> where P : Publisher, Q : Publisher, R : Publisher, Self.Failure == P.Failure, P.Failure == Q.Failure, Q.Failure == R.Failure
返回值
一个从这个发布者和其他三个发布者接收和组合元素的发布者。
参数
publisher1
与第一个发布者合并的第二个发布者。
publisher2
第三个发布者与第一个发布者合并。
publisher3
与第一个发布者合并的第四个发布者。
transform
从每个发布者接收最新值并返回要发布的新值的闭包。
详述
当您需要组合当前和 3 个附加发布者并使用指定已发布元素的闭包转换值以发布新元素时,请使用 Publisher/combineLatest(_:_:_:_:)
。
合并的发布者将所有请求传递给all
上游发布者。但是,它仍然遵循仅向下游发送请求量的demand-fulfilling 规则。如果需求不是 Subscribers/Demand/unlimited
,它会从上游发布者那里删除值。它通过为每个上游使用 1 的缓冲区大小来实现这一点,并在每个缓冲区中保存最新的值。
所有上游发布者都需要完成此发布者才能完成。如果上游发布者从不发布值,则此发布者永远不会完成。
在下面的示例中,由于 Publisher/combineLatest(_:_:_:_:)
接收四个发布者发布的最新值,将它们相乘,然后重新发布结果:
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) { firstValue, secondValue, thirdValue, fourthValue in
return firstValue * secondValue * thirdValue * fourthValue
}
.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: 36. // pub = 2, pub2 = 2, pub3 = 9, pub4 = 1
// Result: 54. // pub = 3, pub2 = 2, pub3 = 9, pub4 = 1
// Result: 324. // pub = 3, pub2 = 12, pub3 = 9, pub4 = 1
// Result: 1404. // pub = 13, pub2 = 12, pub3 = 9, pub4 = 1
// Result: 2964. // pub = 13, pub2 = 12, pub3 = 19, pub4 = 1
可用版本
iOS 13.0+, iPadOS 13.0+, macOS 10.15+, Mac Catalyst 13.0+, tvOS 13.0+, watchOS 6.0+
相关用法
- Swift Result.Publisher combineLatest(_:_:_:)用法及代码示例
- Swift Result.Publisher combineLatest(_:_:)用法及代码示例
- Swift Result.Publisher combineLatest(_:)用法及代码示例
- Swift Result.Publisher compactMap(_:)用法及代码示例
- Swift Result.Publisher contains(_:)用法及代码示例
- Swift Result.Publisher collect(_:options:)用法及代码示例
- Swift Result.Publisher collect(_:)用法及代码示例
- Swift Result.Publisher catch(_:)用法及代码示例
- Swift Result.Publisher zip(_:_:_:)用法及代码示例
- Swift Result.Publisher tryLast(where:)用法及代码示例
- Swift Result.Publisher sink(receiveCompletion:receiveValue:)用法及代码示例
- Swift Result.Publisher merge(with:_:_:)用法及代码示例
- Swift Result.Publisher tryCompactMap(_:)用法及代码示例
- Swift Result.Publisher print(_:to:)用法及代码示例
- Swift Result.Publisher sink(receiveValue:)用法及代码示例
- Swift Result.Publisher eraseToAnyPublisher()用法及代码示例
- Swift Result.Publisher setFailureType(to:)用法及代码示例
- Swift Result.Publisher first(where:)用法及代码示例
- Swift Result.Publisher output(at:)用法及代码示例
- Swift Result.Publisher tryCatch(_:)用法及代码示例
- Swift Result.Publisher dropFirst(_:)用法及代码示例
- Swift Result.Publisher merge(with:_:_:_:_:_:_:)用法及代码示例
- Swift Result.Publisher flatMap(maxPublishers:_:)用法及代码示例
- Swift Result.Publisher map(_:_:_:)用法及代码示例
- Swift Result.Publisher drop(while:)用法及代码示例
注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Result.Publisher combineLatest(_:_:_:_:)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。