RxSwift:嵌套可观察对象上的 FlatMap
RxSwift: FlatMap on nested observables
我在其他不同的视图模型中使用了这个编辑器视图模型。父视图模型有一个可选择的用户,一旦选择了一个用户,我将需要一个新的编辑器实例和新用户。
这是一个简化版的编辑器和父级。
class EditorViewModel {
let user: String
let item = PublishSubject<String>()
init(user: String) {
self.user = user
}
}
class ParentViewModel {
var editor: Observable<EditorViewModel>!
let user = BehaviorSubject<String?>(value: nil)
init() {
editor = user.compactMap { [=10=] }.map { EditorViewModel(user: [=10=]) }
}
}
一旦编辑器保存了一个项目,我希望通过flatMap
将编辑器连接到它的项目来获取保存的项目。像这样:
let parent = ParentViewModel()
parent.editor.flatMapLatest { [=11=].item }.debug("item").subscribe(onNext: { item in
print("This doesn't print")
})
parent.editor.subscribe(onNext: { editor in
print("This one prints")
editor.item.onNext("something")
})
parent.user.onNext("1")
flatMap 行确实订阅了,但它从未获得任何项目。
这是 运行 上述代码在 playground 中的输出:
2021-10-28 13:47:41.528: item -> subscribed
This one prints
此外,如果您认为这个设置过于疯狂,我同意并乐于接受建议。
默认情况下,Observables 是冷的。这意味着每个订阅独立工作,在这种情况下每个订阅都获得不同的 EditorViewModel。 (.map { EditorViewModel(user: [=10=]) }
Observable 将为每个订阅调用其闭包。)
在 .map { EditorViewModel(user: [=10=]) }
Observable 之后添加 .share()
或 .share(replay: 1)
会使它变热,这意味着所有订阅将共享相同的效果。
关于你的子问题。我不认为我会设置这样一个系统,除非这个代码之外的东西迫使我这样做。相反,我会将 Observable 传递给 EditorViewModel 而不是原始用户。这样您就不需要在每次用户更改时都重建编辑器视图模型。
我在其他不同的视图模型中使用了这个编辑器视图模型。父视图模型有一个可选择的用户,一旦选择了一个用户,我将需要一个新的编辑器实例和新用户。
这是一个简化版的编辑器和父级。
class EditorViewModel {
let user: String
let item = PublishSubject<String>()
init(user: String) {
self.user = user
}
}
class ParentViewModel {
var editor: Observable<EditorViewModel>!
let user = BehaviorSubject<String?>(value: nil)
init() {
editor = user.compactMap { [=10=] }.map { EditorViewModel(user: [=10=]) }
}
}
一旦编辑器保存了一个项目,我希望通过flatMap
将编辑器连接到它的项目来获取保存的项目。像这样:
let parent = ParentViewModel()
parent.editor.flatMapLatest { [=11=].item }.debug("item").subscribe(onNext: { item in
print("This doesn't print")
})
parent.editor.subscribe(onNext: { editor in
print("This one prints")
editor.item.onNext("something")
})
parent.user.onNext("1")
flatMap 行确实订阅了,但它从未获得任何项目。
这是 运行 上述代码在 playground 中的输出:
2021-10-28 13:47:41.528: item -> subscribed
This one prints
此外,如果您认为这个设置过于疯狂,我同意并乐于接受建议。
默认情况下,Observables 是冷的。这意味着每个订阅独立工作,在这种情况下每个订阅都获得不同的 EditorViewModel。 (.map { EditorViewModel(user: [=10=]) }
Observable 将为每个订阅调用其闭包。)
在 .map { EditorViewModel(user: [=10=]) }
Observable 之后添加 .share()
或 .share(replay: 1)
会使它变热,这意味着所有订阅将共享相同的效果。
关于你的子问题。我不认为我会设置这样一个系统,除非这个代码之外的东西迫使我这样做。相反,我会将 Observable 传递给 EditorViewModel 而不是原始用户。这样您就不需要在每次用户更改时都重建编辑器视图模型。