【发布时间】:2020-07-24 23:31:22
【问题描述】:
好的,所以我正在使用最新版本的 Swift 和 Combine。
我的目标是将 3 个 CurrentValueSubject 或 PassthroughSubject 组合成一个序列,等待它们全部发出一次。
我们来看下面的例子:
var var1 = CurrentValueSubject<[String], Never>)([])
var var2 = CurrentValueSubject<Int, Never>(0)
var var3 = CurrentValueSubject<Date?, Never>(nil)
当它们各自发出一个新序列时,我希望将所有值合二为一。
所以我可以这样做:
Publishers
.CombineLatest3(var1, var2, var3)
.sink(receivedValue: { var1, var2, var3 in
print("Printed!")
})
.store(in: &subscriptions)
好的,这样就可以了,但它会在第二遍打印Printed! 3 次。
比方说,如果我执行以下代码,它只会执行一次。
var1.send(["test","test1"])
var2.send(0)
var3.send(Date())
但我添加了这个
var1.send(["test","test1"])
var2.send(0)
var3.send(Date())
var1.send(["test","test1"])
它将再次触发我的联合发布者。只有当我有以下情况时,我才想再次触发它:
var1.send(["test","test1"])
var2.send(0)
var3.send(Date())
var1.send(["test2","test3"])
var2.send(2)
var3.send(Date())
我希望这是有道理的,如果您知道如何解决此问题,请告诉我!
【问题讨论】:
-
你可以使用
Publishers.Zip3- 它只会在三个都发出它们的值后才发出一个值 -
该死的@NewDev 非常感谢!我在文档中阅读了有关 Zip 的信息,但我不明白它特别是这样做的! ??????
-
Combine 基于响应式扩展 (Rx) 范式。这意味着您可以利用近十年的 Rx 教程和指南来更好地了解 Combine 提供的内容。例如,rxmarbles 可让您以可视方式、交互方式探索 combineLatest 和 zip。
标签: swift reactive-programming combine