Ich bin wirklich neu in Rx und RxSwift und ich versuche zu lernen, indem ich gleichzeitig lese und tue, also bringt dich diese Frage vielleicht zum Lachen. Bitte, entschuldige mich im Voraus: PForward transformed Event von Observable direkt zu BehaviourSubject
Ich habe diese Architektur:
MatchView -> MatchViewModel -> P2PSession -> MCSession+Rx
ich eine Reactive Erweiterung von MCSession
gemacht haben Sitzungszustand zu machen, ändert sich eine beobachtbare:
var didChangeState: Observable<(MCPeerID, MCSessionState)> {
return RxMCSessionDelegateProxy.proxy(for: base).didChangeStateSubject.asObservable()
}
Dann Ich habe ein anderes Objekt, P2PSession
, das beobachtbar abonniert, um das empfangene Ereignis zu transformieren, um es an eine BehaviorSubject<MCPeerID?>
zu emittieren, die von meiner MatchViewModel
beobachtet wird, die es transformieren wird, um zu einerzu emittierenin einem Etikett angezeigt werden.
Vielleicht Verkettungs völlig lächerlich ist, aber hier ist die komplette (aber vereinfacht) Sache:
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)
Es funktioniert, als Peer verbindet, wird ein Delegatmethode im RxMCSessionDelegateProxy
und Daten bewegt sich durch die Kette genannt, bis es in dem Etikett dargestellt ist.
Aber ich denke, dass könnte viel eleganter gemacht werden. Ist es möglich, ein transformiertes Ereignis von einem Observablen auf ein Subjekt zu übertragen, ohne die Subskription für das erste Observable zu transformieren und den Wert auf das Subjekt/die Variable zu übertragen? (wie mache ich in P2PSession
). Ich weiß nicht, ob ich mich richtig erklärt habe, aber ich denke, das ist möglich mit flatMap
, aber ich bekomme es nicht richtig, vielleicht brauche ich sowieso die subscribe
und ich versuche, dumme Dinge zu tun.
Vielen Dank, ich brauche deine Hilfe!
Benötigen Sie wirklich ein Thema? Weil dies leicht durch Verketten von Observablen mit map durchgeführt werden kann. Subjekte (Variablen sind Subjekte) addieren den Status und Sie ordnen nur von einem Typ zum anderen zu. –
@FelipeCypriano Vielleicht kann ich mein 'BehaviorSubject' mit' Variable' ändern, aber ich habe das gleiche Problem, oder? Würden Sie mir bitte den Code mit Ihrer Lösung zeigen? Vielen Dank. – emenegro
Wenn Sie die richtige Antwort bemerken, ist nicht auf Themen angewiesen. Sie könnten den Lesezugriff auf Ihre Klassen-Interna offen legen, ohne dass Sie diese benötigen oder benötigen. –