将转换后的事件从 Observable 直接转发到 BehaviorSubject

Forward transformed event from Observable directly to BehaviourSubject

我对 Rx 和 RxSwift 真的很陌生,我正在尝试边读边做来学习,所以也许这个问题会让你发笑。请提前打扰一下:P

我有这个架构:

MatchView -> MatchViewModel -> P2PSession -> MCSession+Rx

我已经对 MCSession 进行了 Reactive 扩展,以使会话状态更改成为可观察的:

var didChangeState: Observable<(MCPeerID, MCSessionState)> {
    return RxMCSessionDelegateProxy.proxy(for: base).didChangeStateSubject.asObservable()
}

然后,我有另一个对象 P2PSession,订阅了该可观察对象,以便将接收到的事件转换为 BehaviorSubject<MCPeerID?> 以供我的 MatchViewModel 观察,这会将其转换为发出 Variable<String> 以显示在标签中。

也许链接是完全荒谬的,但这是完整的(但经过简化的)事情:

P2PSession

var connectedPeer: BehaviorSubject<MCPeerID?> = BehaviorSubject(value: nil)

mcSession.rx.didChangeState
    .subscribe(onNext: { self.connectedPeer.onNext([=12=].0) })
    .disposed(by: disposeBag)

MatchViewModel

var peerName = Variable("")

p2pSession.connectedPeer.asObservable()
    .map({ [=13=]?.displayName ?? "None" })
    .subscribe(onNext: { self.peerName.value = [=13=] })
    .disposed(by: disposeBag)

匹配视图

viewModel.peerName.asDriver()
    .drive(peerLabel.rx.text)
    .disposed(by: disposeBag)

它起作用了,作为对等连接,在 RxMCSessionDelegateProxy 中调用委托方法,数据在链中传输,直到显示在标签中。

但我认为可以做得更优雅。是否可以将转换后的事件从可观察对象转发到主题,而无需订阅第一个可观察对象来转换并将值注入 subject/variable? (正如我在 P2PSession 中所做的那样)。我不知道我是否已经正确地解释了自己,但我认为 flatMap 是可能的,但我没有正确理解,也许我无论如何都需要 subscribe 而我正在尝试做傻事东西。

非常感谢,我需要你的帮助!

通过 Observable 公开连接的对等点,并通过 Driver:

公开对等点名称
let connectedPeer: Observable<MCPeerID?>
connectedPeer = mcSession.rx.didChangeState.map { [=10=].0 }

let peerName: Driver<String>
peerName = p2pSession.connectedPeer.map { [=10=].displayName ?? "None" }.asDriver(onErrorJustReturn: "None")

viewModel.peerName.drive(peerLabel.rx.text).disposed(by: disposeBag)