首页 > 解决方案 > 我可以用可完成的方式将平面映射到其他流吗?

问题描述

我有几个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连续三个?

标签: iosswiftrx-swiftflatmap

解决方案


你肯定在正确的轨道上考虑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)

推荐阅读