从另一个 CurrentValueSubject 创建一个 CurrentValueSubject

Posted

技术标签:

【中文标题】从另一个 CurrentValueSubject 创建一个 CurrentValueSubject【英文标题】:Create a CurrentValueSubject from another 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 【参考方案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

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

【讨论】:

以上是关于从另一个 CurrentValueSubject 创建一个 CurrentValueSubject的主要内容,如果未能解决你的问题,请参考以下文章

什么是 PassthroughSubject 和 CurrentValueSubject

CurrentValueSubject 和 @Published 之间的区别

如何使用 Combine 的 CurrentValueSubject 并在 SwiftUI 视图中访问它?

带有 CurrentValueSubject 绑定的 TextField 上的“Binding<String> 操作尝试每帧更新多次”

从另一个服务启动服务

从另一个存储过程 oracle 调用存储过程