正在处理 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的主要内容,如果未能解决你的问题,请参考以下文章
处理 UITableView 绑定中的连接错误(Moya、RxSwift、RxCocoa)