ios - 我可以用可完成的方式将平面映射到其他流吗?
问题描述
我有几个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:)
该一次性返回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)
推荐阅读
- javascript - React:为一个变量设置状态也设置了不同的状态
- slack - 如何格式化键盘键(即) on slack?
- android - 自定义 CircleImageView 边框
- ios - 切换选项卡时未调用 NSFetchedResultsControllerDelegate 方法
- flutter - 我想覆盖firestore颤振中的文档
- python-3.x - 单调的堆栈和队列。定义和例子
- python - 仅比较具有相同日期时间索引的列值
- php - 警告:需要(/home1/mokwattr/public_html/wp-includes/version.php)
- c# - C# 类库或 Web API
- ajax - 在 selenium 中处理网页对话框