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

Swift Combine - Multiple Observable (CurrentValueSubject or PassthroughSubject) into one but wait for update from all

好的,所以我将 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())

我希望这是有道理的,如果您知道如何解决这个问题,请告诉我!

Zip3 好像是你要找的:

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

来自 zip 的文档:

Use zip(_:_:) to return a new publisher that combines the elements from two additional publishers to publish a tuple to the downstream. The returned publisher waits until all three publishers have emitted an event, then delivers the oldest unconsumed event from each publisher as a tuple to the subscriber.

a visualisation on RxMarbles