首页 文章

在某些观察者完成/处置之后,让主体“倾听”

提问于
浏览
1

我想将多个observable连接到一个共同的Subject . 可以处置可观察量,并且将创建新的可观察量并由同一主体订阅 .

我创建并删除了几个自定义UIViews,每个UIViews都包含发送到同一Subject的Observers .

例如:在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或我后来创建的其他可观察对象的其他事件 .

How do I create/configure a observer-subject relationship where the subject stays active while its observers are disposed?

主题是否可以配置为忽略完整/处置事件?我是否需要重写.subscribe以单独处理onNext,onComplete等?是否有一些模式可以遵循?

1 回答

  • 1

    你需要将两个点击可观察量 merge 放入一个observable然后订阅它 . 合并的observable在其所有组件可观察量完成或出错之前不会完成 .

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

    由于您评论这些按钮来来往往,您可能需要使用 flatMap . 导致视图出现的函数需要发出tap可观察对象 . 父母可观察到的孩子也是如此,但在这种情况下,它的子女是动态生成的 .

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

相关问题