Подписаться, чтобы просмотреть свойство контроллера без вложенного цикла подписки - PullRequest
0 голосов
/ 31 октября 2018

Как сделать так, чтобы этот цикл подписки не был вложенным? Кажется, я не могу понять, как вы будете поступать так, потому что я помещаю контроллер представления в основной цикл подписки, а не просто устанавливаю значение.

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 голосов
/ 01 ноября 2018

Вы можете использовать .sample() или .combineLatest(), в зависимости от того, как обновляется publishRelay.

Например, Observable.combineLatest(myPublishRelay, button.rx.tap) { $0 }.subscribe(onNext: { value ...

См. http://rxmarbles.com для справки об операторах.

0 голосов
/ 02 января 2019

Всякий раз, когда я вижу вложенную подписку, я думаю о 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
    })
0 голосов
/ 01 ноября 2018

Вам нужны два разных побочных эффекта, поэтому имеет смысл иметь две подписки. Чтобы предотвратить вложение, вы можете сделать что-то в следующих строках:

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 произойдет дважды, что заставит нас подписаться на реле публикации контроллера представления, которое не , которое мы представили.

...