【问题标题】:Can I flatMap into other streams with completables?我可以用可完成的方式将平面映射到其他流吗?
【发布时间】:2021-05-16 06:17:51
【问题描述】:

我有几个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

【问题讨论】:

  • 你为什么要订阅 setupDoorMode 的 onNext 内的其他主题/中继 经验法则是,如果你必须订阅 onNext 块内的其他主题,你已经搞砸了设计和有更好的设计来处理
  • @SandeepBhandari 是的,这正是我所要求的。我该如何以“正确”的方式做到这一点。

标签: ios swift rx-swift flatmap


【解决方案1】:

您在考虑 flatMap 来编写您的 observable 时肯定走在正确的轨道上。这里要注意的是,调用.subscribe() 会返回一个Disposable 类型,并在该一次性返回Void 又名() 类型上调用.disposed(by:)。你不能写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)

【讨论】:

  • 很好,非常感谢你帮助我@NikitaKukushkin。不过有一件事:当 ConnectAndOpenDoor 完成后,我希望触发 openOrCloseDoor。我该如何合并它?
  • 啊,没注意到。你可以在connectAndOpenDoor()之后再做一个flatMap,或者,如果你的信号可以多次触发并且你真的需要onCompleted触发器,你可以添加.do(onCompleted:)但是你必须订阅内部信号.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
相关资源
最近更新 更多