Swift 将多个 Observable(CurrentValueSubject 或 PassthroughSubject)合并为一个,但等待所有的更新
Swift Combine - Multiple Observable (CurrentValueSubject or PassthroughSubject) into one but wait for update from all
好的,所以我将 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())
我希望这是有道理的,如果您知道如何解决这个问题,请告诉我!
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.
好的,所以我将 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())
我希望这是有道理的,如果您知道如何解决这个问题,请告诉我!
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.