在它的一些观察者 complete/disposed 之后保留一个主题 "listening"

Keep a subject "listening" after some of it's observers are complete/disposed

我想将多个可观察对象连接到一个共同的主题。可观察对象可能会被处置,新的可观察对象将被创建并由同一主题订阅。

我创建并删除了几个自定义 UIView,每个 UIView 都包含向同一主题发出的观察者。

例如:在 myView1 中,我有:

myButton1.rx.tap
   .subscribe(sameViewModel.subject)
   .disposed(by: disposeBag1)

在 myView2 中,我有:

myButton2.rx.tap
    .subscribe(sameViewModel.subject)
    .disposed(by: disposeBag2)

在这个简单的示例中,sameViewModel.subject 是实例 (sameViewModel) 中的相同 PublishSubject,当 myView1 和 myView2 被删除时,它不会取消初始化。

当 myView1 被移除时,它的 disposeBag1 被释放并且 myButton1.rx.tap 发出它的 onComplete 和 onDispose 通知。这导致 sameViewModel.subject 也完成并处理。对象不再响应来自 myButton2.rx.tap 或我稍后创建的其他可观察对象的进一步事件。

我如何create/configure观察者-主体关系,其中主体保持活动状态而其观察者被处置?

可以将主题配置为忽略 complete/dispose 事件吗? 我是否需要重写 .subscribe 以单独处理 onNext、onComplete 等?有什么规律可循吗?

您需要 merge 将两个 tap observable 合并为一个 observable,然后订阅它。合并的 observable 将不会完成,直到它的所有组件 observable 完成或出错。

let taps = Observable.from([button1.rx.tap, button2.rx.tap]).merge()

既然您评论说这些按钮来来去去,您可能需要改用 flatMap。导致视图出现的函数需要发出 tap observables。同样,父可观察对象不会完成或出错,直到它的所有子对象都完成,但在这种情况下,它的子对象是动态生成的。

func displayView() -> Observable<Void> {
    // create and display view
    return view.button.rx.tap.asObservable()
}

let taps = triggerToDisplayView().flatMap { displayView() }