gpt4 book ai didi

ios - 如何在RxSwift中使用flatMap观察上层Observable?

转载 作者:行者123 更新时间:2023-12-01 18:35:27 25 4
gpt4 key购买 nike

here说明了mapflatMapRxSwift之间的差异。现在,我想观察内部可观察到的变化时,上面的可观察实例。 我该怎么做?

让我们看一个例子,

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

如预期的那样。但是我想知道订阅块 age中完整的Player对象状态(即播放器的 .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。

同样,主题绝不能使用 var进行保存,它们应该始终是 let。用不同的主题替换主题是没有意义的。

从长远来看,最好将其从Player结构中删除,然后使其成为可能:
struct Player {
var age: Int
var score: Int
}

关于ios - 如何在RxSwift中使用flatMap观察上层Observable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60089331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com