我真的是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)

10-06 07:23