快速合并-将多个Observable(CurrentValueSubject或PassthroughSubject)合并为一个,但等待所有更新

时间:2020-07-24 23:31:22

标签: swift reactive-programming combine

好,所以我将Swift的最新版本与Combine结合使用。 我的目标是等待3个CurrentValueSubjectPassthroughSubject全部发射一次,将它们组合成一个序列。

让我们举一个例子:

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())

我希望这是有道理的,如果您有解决此问题的想法,请告诉我!

1 个答案:

答案 0 :(得分:1)

Zip3似乎是您想要的:

Publishers
    .Zip3(var1, var2, var3)
    .sink(receivedValue: { var1, var2, var3 in
        print("Printed!")
    })
    .store(in: &subscriptions)

摘自zip的文档:

使用zip(_:_:)返回一个新的发布者,该发布者将来自两个其他发布者的元素组合在一起,以将元组发布到下游。返回的发布者将等到所有三个发布者都发出一个事件,然后将来自每个发布者的最旧的未消耗事件作为元组传递给订阅者。

请参见a visualisation on RxMarbles