我可以将 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)