将绑定Publisher与PassthroughSubject合并



这个问题以前曾被有效地问过(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()
}

相关内容

  • 没有找到相关文章

最新更新