Я связываю кнопку нажатой, чтобы PublishSubject
в маршрутизаторе, как так:RxSwift PublishSubject в настоящее время расположено
hambugerButton
.rx_tap
.bindTo(router.openMenu)
.addDisposableTo(disposeBag)
В моем маршрутизаторе:
let openMenu = PublishSubject<Void>()
//...
openMenu
.map { _ in
menuNavigationController
}
.bindTo(mainNavigationController.rx_present())
.addDisposableTo(disposeBag)
Однако, когда контроллер быть высвобождены, кнопка передавая «полный» сигнал. Когда PublishSubject
получает его, он не будет реагировать на сигналы от другого контроллера (что понятно: это гарантия Observable
).
Единственное решение, которое я придумал:
hambugerButton
.rx_tap
.subscribeNext {
self.router.openMenu.onNext()
}
.addDisposableTo(disposeBag)
который выглядит некрасиво и своего рода портит идею реактивного интерфейса. Мой вопрос в том, есть ли способ избежать распространения события Completed
на PublishSubject
? Могу ли я сделать Observer
, который будет игнорировать такие события?
Да, спасибо, я просто не копировать disposeBag. Я не хочу, чтобы он был освобожден из-за того, что Router является глобальным объектом, а другой контроллер может/будет/связывается с ним. Некоторая вещь refCount может быть полезной здесь. – charlag
Я вижу, что вы сейчас говорите. Это хороший вопрос, я не уверен в том, что это лучший способ сделать это, чем просто называть 'onNext', как вы уже есть. Я не знаю, как можно подавить событие «Завершено», но теперь вы задумались;) Однако я думаю, что он задает вопрос о том, следует ли вам в первую очередь пытаться. Этого, и синглтонов часто можно избежать. – solidcell