我可以将 flatMap 转换为具有可完成项的其他流吗?
Can I flatMap into other streams with completables?
我有几个 completable rx subscriptions
在像这样的流中:
viewModel?.setupDoorMode().subscribe(onNext: { shouldConnectToDoor in
if shouldConnectToDoor {
self.viewModel?.connectAndOpenDoor().subscribe(onCompleted: {
self.viewModel?.openOrCloseDoor().subscribe().disposed(by: self.disposeBag)
}).disposed(by: self.disposeBag)
} else {
self.viewModel?.openOrCloseDoor().subscribe().disposed(by: self.disposeBag)
}
}).disposed(by: disposeBag)
我觉得这可以用更好的方式完成,比如将流平面映射到另一个流中。但是,当我尝试使用 flatMap
时,出现错误 Type '()' cannot conform to 'ObservableConvertibleType'; only struct/enum/class types can conform to protocols
。我对 rx
不太熟悉,无法理解该消息。无论如何,有没有办法创建一个看起来更流畅的流而不是连续三个 subscriptions
?
考虑 flatMap
来构建您的可观察对象,您绝对是在正确的轨道上。这里要注意的是,调用 .subscribe()
returns 一个 Disposable
类型并调用 .disposed(by:)
一次性 returns Void
aka ()
类型。你不会写 Voids
。您已经编写了可观察对象,然后您订阅了结果。
guard let viewModel = viewModel else { return }
// Combine the observables
let doorActionObservable = viewModel
.setupDoorMode()
.flatMap { /* mind the retain cycle */ shouldConnectToDoor in
if shouldConnectToDoor {
return self.viewModel.connectAndOpenDoor()
} else {
return self.viewModel.openOrCloseDoor()
}
}
// Subscribe to the the resulting observable
doorActionObservable
.subscribe()
.disposed(by: disposeBag)
我有几个 completable rx subscriptions
在像这样的流中:
viewModel?.setupDoorMode().subscribe(onNext: { shouldConnectToDoor in
if shouldConnectToDoor {
self.viewModel?.connectAndOpenDoor().subscribe(onCompleted: {
self.viewModel?.openOrCloseDoor().subscribe().disposed(by: self.disposeBag)
}).disposed(by: self.disposeBag)
} else {
self.viewModel?.openOrCloseDoor().subscribe().disposed(by: self.disposeBag)
}
}).disposed(by: disposeBag)
我觉得这可以用更好的方式完成,比如将流平面映射到另一个流中。但是,当我尝试使用 flatMap
时,出现错误 Type '()' cannot conform to 'ObservableConvertibleType'; only struct/enum/class types can conform to protocols
。我对 rx
不太熟悉,无法理解该消息。无论如何,有没有办法创建一个看起来更流畅的流而不是连续三个 subscriptions
?
考虑 flatMap
来构建您的可观察对象,您绝对是在正确的轨道上。这里要注意的是,调用 .subscribe()
returns 一个 Disposable
类型并调用 .disposed(by:)
一次性 returns Void
aka ()
类型。你不会写 Voids
。您已经编写了可观察对象,然后您订阅了结果。
guard let viewModel = viewModel else { return }
// Combine the observables
let doorActionObservable = viewModel
.setupDoorMode()
.flatMap { /* mind the retain cycle */ shouldConnectToDoor in
if shouldConnectToDoor {
return self.viewModel.connectAndOpenDoor()
} else {
return self.viewModel.openOrCloseDoor()
}
}
// Subscribe to the the resulting observable
doorActionObservable
.subscribe()
.disposed(by: disposeBag)