从另一个 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> 操作尝试每帧更新多次”