我真的是Rx和RxSwift的新手,我想通过阅读和同时学习来学习,所以也许这个问题会让您发笑。拜托,请原谅我:P
我有这个架构:
MatchView -> MatchViewModel -> P2PSession -> MCSession+Rx
我做了
MCSession
的Reactive扩展,以使 session 状态更改可观察到: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($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
,并且我正在尝试做一些愚蠢的事情。非常感谢您,我需要您的帮助!
最佳答案
通过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)