【问题标题】:Swift Combine - Multiple Observable (CurrentValueSubject or PassthroughSubject) into one but wait for update from allSwift Combine - 多个 Observable(CurrentValueSubject 或 PassthroughSubject)合二为一,但等待所有更新
【发布时间】:2020-07-24 23:31:22
【问题描述】:

好的,所以我正在使用最新版本的 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())

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

【问题讨论】:

  • 你可以使用Publishers.Zip3 - 它只会在三个都发出它们的值后才发出一个值
  • 该死的@NewDev 非常感谢!我在文档中阅读了有关 Zip 的信息,但我不明白它特别是这样做的! ??????
  • Combine 基于响应式扩展 (Rx) 范式。这意味着您可以利用近十年的 Rx 教程和指南来更好地了解 Combine 提供的内容。例如,rxmarbles 可让您以可视方式、交互方式探索 combineLatestzip

标签: swift reactive-programming combine


【解决方案1】:

Zip3 似乎就是您要找的东西:

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

来自zip的文档:

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

a visualisation on RxMarbles

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多