正在处理 RxSwift PublishSubject

Posted

技术标签:

【中文标题】正在处理 RxSwift PublishSubject【英文标题】:RxSwift PublishSubject is being disposed 【发布时间】: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 来忽略此类事件吗?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

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

以上是关于正在处理 RxSwift PublishSubject的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift+Alamofire 自定义映射器错误处理

如何实现串行网络调用队列然后在 RxSwift 中处理?

在 RxSwift 中处理嵌套的 observables

处理 UITableView 绑定中的连接错误(Moya、RxSwift、RxCocoa)

RxSwift - Observable.generate - 使用附加映射处理顺序请求

RxSwift - onError 发出两次