2016-10-06 40 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。 我不希望它被解除分配,因爲路由器是一個全局對象,而另一個控制器可以/將會綁定它。一些refCount的東西可能在這裏很有用。 – charlag

+0

我明白你現在在說什麼。這是一個很好的問題,我不確定是否有更好的方法去做,而不僅僅是像現在這樣調用onNext。我不知道有什麼方法來壓制Completed事件,但現在你讓我思考了;)但是,我認爲它首先會引起你是否應該試圖擺脫這個問題。那個,單身經常是要避免的事情。 – solidcell