【问题标题】:Create a CurrentValueSubject from another CurrentValueSubject从另一个 CurrentValueSubject 创建一个 CurrentValueSubject
【发布时间】:2020-10-09 18:22:16
【问题描述】:

我在一个对象中有一个CurrentValueSubject,我希望另一个CurrentValueSubject 复制第一个的更改。

如果不做这样的事情,我找不到轻松做到这一点的方法:

subjectA.assign(to: \.value, on: subjectB).store(in: &cancelables)

如果能够使用subjectA 初始化subjectB,那就太好了。有没有办法做这样的事情?

编辑: 例如,我认为能够执行以下操作会很棒:

let subjectB = CurrentValueSubject(from: subjectA)

【问题讨论】:

  • 嗨,Andres:你能解释一下“使用subjectA初始化subjectB”是什么意思吗?如果它们总是相同的,为什么需要两个不同的主题?这里的用例是什么?谢谢
  • 谢谢@matt。这是相同的值,但它来自不同的层。在我要使用的地方有不同的“意义”……
  • 嗯,但您确实意识到多个订阅者可以订阅同一个 CurrentValueSubject,对吧?那么谁在乎它的含义是什么?每个订阅的管道都可以随价值随心所欲地做任何事情。
  • 或者,如果您真的在两个不同的地方需要这个,那么只需将第二个设置为订阅第一个并传递值的管道。
  • 是的,我知道这一点。但这更多是一个封装问题。我不想/不能公开“原始”来源。需要考虑一下CurrentValueSubject

标签: ios swift combine


【解决方案1】:

我只想让第二个发布者成为第一个发布者的订阅者。示例:

let pub1 = CurrentValueSubject<String,Never>("howdy")
lazy var pub2 : AnyPublisher<String,Never> = {
    self.pub1.eraseToAnyPublisher()
}()

使用示例:

    pub1.sink {print($0)}.store(in: &storage)
    pub2.sink {print($0)}.store(in: &storage)
    delay(1) {
        self.pub1.send("hey")
        delay(2) {
            self.pub1.send("ho")
        }
    }

输出:

howdy
howdy
[delay]
hey
hey
[delay]
ho
ho

所以两个发布者都给出了相同的值,这似乎是你想要的。

【讨论】:

    猜你喜欢
    • 2021-12-30
    • 2020-06-14
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2014-12-26
    • 1970-01-01
    • 2016-12-15
    相关资源
    最近更新 更多