订阅无嵌套订阅循环的视图控制器属性

时间:2018-10-31 16:45:43

标签: swift rx-swift

如何使此订阅循环不嵌套?我似乎无法弄清楚您将如何执行此操作,因为我在主订阅循环中推送了视图控制器,而不仅仅是设置了一个值。

button.rx.tap.subscribe(onNext: { _ in
    let viewController = MyViewController()
    self.navigationController.pushViewController(viewController)
    viewController.myPublishRelay.asObservable().subscribe(onNext: { value in
        // do something with value

    })
})

3 个答案:

答案 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
    })