将转换后的事件从 Observable 直接转发到 BehaviorSubject
Forward transformed event from Observable directly to BehaviourSubject
我对 Rx 和 RxSwift 真的很陌生,我正在尝试边读边做来学习,所以也许这个问题会让你发笑。请提前打扰一下:P
我有这个架构:
MatchView -> MatchViewModel -> P2PSession -> MCSession+Rx
我已经对 MCSession
进行了 Reactive 扩展,以使会话状态更改成为可观察的:
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([=12=].0) })
.disposed(by: disposeBag)
MatchViewModel
var peerName = Variable("")
p2pSession.connectedPeer.asObservable()
.map({ [=13=]?.displayName ?? "None" })
.subscribe(onNext: { self.peerName.value = [=13=] })
.disposed(by: disposeBag)
匹配视图
viewModel.peerName.asDriver()
.drive(peerLabel.rx.text)
.disposed(by: disposeBag)
它起作用了,作为对等连接,在 RxMCSessionDelegateProxy
中调用委托方法,数据在链中传输,直到显示在标签中。
但我认为可以做得更优雅。是否可以将转换后的事件从可观察对象转发到主题,而无需订阅第一个可观察对象来转换并将值注入 subject/variable? (正如我在 P2PSession
中所做的那样)。我不知道我是否已经正确地解释了自己,但我认为 flatMap
是可能的,但我没有正确理解,也许我无论如何都需要 subscribe
而我正在尝试做傻事东西。
非常感谢,我需要你的帮助!
通过 Observable
公开连接的对等点,并通过 Driver
:
公开对等点名称
let connectedPeer: Observable<MCPeerID?>
connectedPeer = mcSession.rx.didChangeState.map { [=10=].0 }
let peerName: Driver<String>
peerName = p2pSession.connectedPeer.map { [=10=].displayName ?? "None" }.asDriver(onErrorJustReturn: "None")
viewModel.peerName.drive(peerLabel.rx.text).disposed(by: disposeBag)
我对 Rx 和 RxSwift 真的很陌生,我正在尝试边读边做来学习,所以也许这个问题会让你发笑。请提前打扰一下:P
我有这个架构:
MatchView -> MatchViewModel -> P2PSession -> MCSession+Rx
我已经对 MCSession
进行了 Reactive 扩展,以使会话状态更改成为可观察的:
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([=12=].0) })
.disposed(by: disposeBag)
MatchViewModel
var peerName = Variable("")
p2pSession.connectedPeer.asObservable()
.map({ [=13=]?.displayName ?? "None" })
.subscribe(onNext: { self.peerName.value = [=13=] })
.disposed(by: disposeBag)
匹配视图
viewModel.peerName.asDriver()
.drive(peerLabel.rx.text)
.disposed(by: disposeBag)
它起作用了,作为对等连接,在 RxMCSessionDelegateProxy
中调用委托方法,数据在链中传输,直到显示在标签中。
但我认为可以做得更优雅。是否可以将转换后的事件从可观察对象转发到主题,而无需订阅第一个可观察对象来转换并将值注入 subject/variable? (正如我在 P2PSession
中所做的那样)。我不知道我是否已经正确地解释了自己,但我认为 flatMap
是可能的,但我没有正确理解,也许我无论如何都需要 subscribe
而我正在尝试做傻事东西。
非常感谢,我需要你的帮助!
通过 Observable
公开连接的对等点,并通过 Driver
:
let connectedPeer: Observable<MCPeerID?>
connectedPeer = mcSession.rx.didChangeState.map { [=10=].0 }
let peerName: Driver<String>
peerName = p2pSession.connectedPeer.map { [=10=].displayName ?? "None" }.asDriver(onErrorJustReturn: "None")
viewModel.peerName.drive(peerLabel.rx.text).disposed(by: disposeBag)