【问题标题】:RxSwift PublishSubject is being disposed正在处理 RxSwift PublishSubject
【发布时间】:2016-10-06 17:54:08
【问题描述】:

我将按下的按钮绑定到路由器中的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 来忽略此类事件吗?

【问题讨论】:

    标签: swift rx-swift reactivex


    【解决方案1】:

    如果拥有hamburgerButton 的视图控制器正在被解除分配,因此hamburgerButton 也被解除分配,您为什么不希望与router.openMenu 的绑定也被解除分配?您的问题可能不清楚您的视图控制器层次结构是什么。

    此外,在第一个 sn-p 中,您不应该在不将其添加到 DisposeBag 的情况下进行绑定,如下所示:

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

    【讨论】:

    • 是的,谢谢我只是没有复制 disposeBag。我不希望它被释放,因为路由器是一个全局对象,另一个控制器可以/将/绑定到它。一些 refCount 的东西在这里可能很有用。
    • 我明白你现在在说什么了。这是一个很好的问题,我不确定是否有比你已经打电话给onNext 更好的方法。我不知道有什么方法可以压制Completed 事件,但现在你让我思考了;)但是,我认为它引出了一个问题,即你是否应该首先尝试。那,单身人士通常是要避免的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多