[英]How to observe upper Observables with flatMap in RxSwift?
RxSwift
map
和flatMap
之間的RxSwift
已經在這里解釋了。 現在我想在內部 observable 發生變化時觀察上層 observable 實例。 我怎么能這樣做?
我們來看例子,
func testFlatMap() {
let bag = DisposeBag()
struct Player {
var age: Int
var score: BehaviorSubject<Int>
}
let male = Player(age: 28, score: BehaviorSubject(value: 80))
let player = PublishSubject<Player>()
player.asObservable()
.flatMap { $0.score.asObservable() }
.subscribe(onNext: { print($0) })
.disposed(by: bag)
player.on(.next(male))
male.score.on(.next(100))
}
在上面的例子中,輸出是,
80
100
正如預期的那樣。 但是我想知道 subscribe 塊.subscribe(onNext: { print($0) })
完整的 Player 對象狀態(即玩家的age
.subscribe(onNext: { print($0) })
但它只得到了score
。 我怎么能這樣做?
我的預期輸出是,
Player (where I can access both age:28 and score:80)
Player (where I can access both age:28 and score:100)
另一種選擇是:
player.asObservable()
.flatMap { Observable.combineLatest(Observable.just($0.age), $0.score.asObservable()) }
從類別理論 POV 來看,這被認為是一種更清潔的方法(您將年齡值“提升”到 monad 中),但是 YMMV。
此外,Subjects 永遠不應該放在var
,它們應該始終放在let
s 中。 用不同的主題替換主題是沒有意義的。
從長遠來看,從您的 Player 結構中刪除主題並使其成為可能會更好:
struct Player {
var age: Int
var score: Int
}
您從flatMap
返回一個可觀察的分數,因此下游只有一個分數可用。 相反,您希望返回一個可觀察的玩家信息。 您可以通過使用額外的map
運算符和關閉玩家參數將年齡附加到分數:
player.asObservable()
.flatMap { p in
p.score.asObservable()
.map { score in (age: p.age, score: p.score) } }
.subscribe(onNext: { print($0) })
.disposed(by: bag)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.