簡體   English   中英

如何在 RxSwift 中使用 flatMap 觀察上層 Observable?

[英]How to observe upper Observables with flatMap in RxSwift?

RxSwift mapflatMap之間的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM