2016-10-06 4 views
0

Я связываю кнопку нажатой, чтобы 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, который будет игнорировать такие события?

ответ

0

Если контроллер представления, которое владеет hamburgerButton в настоящее время освобождаться, и, таким образом, hamburgerButton также быть высвобожден, почему бы Вам не связывание с router.openMenu также освобождаться? Может быть, неясно, от чего зависит ваша иерархия диспетчера просмотров от вашего вопроса.

Кроме того, в первом фрагменте кода, вы не должны делать привязки без добавления его к DisposeBag как так:

hambugerButton 
    .rx_tap 
    .bindTo(router.openMenu) 
    .addDisposableTo(disposeBag) 
+0

Да, спасибо, я просто не копировать disposeBag. Я не хочу, чтобы он был освобожден из-за того, что Router является глобальным объектом, а другой контроллер может/будет/связывается с ним. Некоторая вещь refCount может быть полезной здесь. – charlag

+0

Я вижу, что вы сейчас говорите. Это хороший вопрос, я не уверен в том, что это лучший способ сделать это, чем просто называть 'onNext', как вы уже есть. Я не знаю, как можно подавить событие «Завершено», но теперь вы задумались;) Однако я думаю, что он задает вопрос о том, следует ли вам в первую очередь пытаться. Этого, и синглтонов часто можно избежать. – solidcell

Смежные вопросы