如何使此订阅循环不嵌套?我似乎无法弄清楚您将如何执行此操作,因为我在主订阅循环中推送了视图控制器,而不仅仅是设置了一个值。
button.rx.tap.subscribe(onNext: { _ in
let viewController = MyViewController()
self.navigationController.pushViewController(viewController)
viewController.myPublishRelay.asObservable().subscribe(onNext: { value in
// do something with value
})
})
答案 0 :(得分:0)
您需要两个不同的副作用,因此有两个订阅是有意义的。为了防止嵌套,您可以执行以下操作:
let viewControllerToPresent = button.rx.tap.map { _ in
return MyViewController()
}.share()
viewControllerToPresent.subscribe(onNext: { [unowned self] viewController in
self.view.pushViewController(viewController)
}.disposed(by: self.disposeBag)
viewControllerToPresent.flatMapLatest { viewController in
viewController.myPublishRelay.asObservable()
}.subscribe(onNext: { value in
// do something with value
}.disposed(by: self.disposeBag)
这里对share
的调用很重要,否则rx.tap
之后的映射将发生两次,这使我们订阅了不是的视图控制器的发布中继我们介绍了一个。
答案 1 :(得分:0)
您可以使用.sample()
或.combineLatest()
,具体取决于publishRelay
的更新方式。
例如,Observable.combineLatest(myPublishRelay, button.rx.tap) { $0 }.subscribe(onNext: { value ...
有关操作符的参考,请参见http://rxmarbles.com。
答案 2 :(得分:0)
每当我看到嵌套订阅时,我都会想到flatMap
。这样的事情应该起作用:
button.rx.tap
.flatMap { _ in
let viewController = MyViewController()
self.navigationController.pushViewController(viewController)
return viewController.myPublishRelay.asObservable()
}
.subscribe(onNext: { value in
// do something with value
})