我对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 回答
通过
Observable
公开连接的对等体,通过Driver
公开对等体名称: