这个问题以前曾被有效地问过(Combine将publisher分配给PassthroughSubject),但答案认为问题示例的体系结构完全错误。
我面临着同样的问题,我觉得这是一个不同的例子,我非常希望这个问题能澄清。
我有一个viewmodel类,它为客户端层提供了一个公共的errorMessage
发布器,以执行它将要使用的操作。这里只有一根绳子。私下里,这个出版商得到了CCD_;进入monad";来自内部不同的地方,所以我想在那个阶段强制发送错误消息。
我在这里的一个切入点恰好是另一个联合出版商。我只想映射和绑定,就像在RxSwift中一样:
private let _errorMessageSubject = PublishSubject<String>()
public let errorMessageRail = _errorMessageSubject.asObservable()
private func setup() {
...
myEngine.errorMessages
.map { msg in "Internal error: (msg)" }
.bind(to: _errorMessageSubject)
...
}
private func someOtherMethod() {
_errorMessageSubject.onNext("Surprise")
}
在联合收割机中,我不知道如何做到这一点,除了:
private let _errorMessageSubject = PassthroughSubject<String,Never>()
public let errorMessageRail = _errorMessageSubject.eraseToAnyPublisher()
private func setup() {
...
myEngine.errorMessages
.map { msg in "Internal error: (msg)" }
.sink { [weak self] msg in
self?._errorMessageSubject.send(msg)
}
...
}
private func someOtherMethod() {
_errorMessageSubject.send("Surprise")
}
在我们讨论并发问题之前,假设我总是在特定的调度队列上小心地推送到_errorMessageSubject
。为了清楚起见,我在上面的代码中省略了它。
因此,举个例子,除非我遗漏了一些显而易见的东西,否则flatMap在这里对我没有帮助。
- 我被这个水槽卡住了吗?->送舞蹈
- 或者,我的公共/私人出版商/主题模式(我经常使用这种模式来连接命令式和反应式架构)是否有一些令人垂涎的代码气味,某种灵魂能指引我走向自我完善的方向吗
这听起来像是你希望你的rail是_errorMessageSubject
和另一个发布者的合并。因此,我将使errorMessageRail
成为一个变量,以便在初始化后可以对其进行更改(仅限此类):
public private(set) var errorMessageRail = _errorMessageSubject.eraseToAnyPublisher()
然后,在设置中,您更改轨道,使其包含附加流:
func setup() {
...
errorMessageRail = _errorMessageSubject.merge( with:
myEngine.errorMessages
.map { msg in "Internal error: (msg)" }
).eraseToAnyPublisher()
}