如何解决我可以使用可完成的将 flatMap 映射到其他流中吗?
我在这样的流中有几个 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
来编写 observables 的想法肯定是正确的。这里要注意的是,调用 .subscribe()
返回一个 Disposable
类型,并在该一次性返回 .disposed(by:)
aka Void
类型上调用 ()
。您无法撰写Voids
。你已经编写了 observables,然后你订阅了结果。
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。