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

时间:2017-10-27 23:09:56

标签: ios swift rx-swift reactivex

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

我有这个架构:

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

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

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 个答案:

答案 0 :(得分: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)