Home Articles

将已变换的事件从Observable直接转发到BehaviourSubject

Asked
Viewed 525 times
1

我对Rx和RxSwift真的很陌生,而且我正在尝试通过阅读和同时学习来学习,所以也许这个问题会让你发笑 . 请原谅我:P

我有这个架构:

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

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

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

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

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

P2PSession

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

mcSession.rx.didChangeState
    .subscribe(onNext: { self.connectedPeer.onNext($0.0) })
    .disposed(by: disposeBag)

MatchViewModel

var peerName = Variable("")

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

MatchView

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

它工作,当对等连接时,在 RxMCSessionDelegateProxy 中调用委托方法,数据通过链传递,直到它显示在标签中 .

但我认为这可以更优雅 . 是否有可能将转换后的事件从可观察对象转发到主题而无需订阅第一个可观察对象来转换并将值注入主题/变量? (正如我在 P2PSession 中所做的那样) . 我没有正确地解释自己,但我认为这可能是 flatMap 但是我没有正确理解,也许我需要 subscribe 无论如何我想做蠢事 .

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

1 Answer

  • 2

    通过 Observable 公开连接的对等体,通过 Driver 公开对等体名称:

    let connectedPeer: Observable<MCPeerID?>
    connectedPeer = mcSession.rx.didChangeState.map { $0.0 }
    
    let peerName: Driver<String>
    peerName = p2pSession.connectedPeer.map { $0.displayName ?? "None" }.asDriver(onErrorJustReturn: "None")
    
    viewModel.peerName.drive(peerLabel.rx.text).disposed(by: disposeBag)
    

Related