Replay(1)在发布内部不起作用

时间:2018-07-05 13:34:26

标签: rx-java rx-java2 rx-kotlin rx-kotlin2

    val subject = PublishSubject.create<UiModel>()

    val pipeline = subject
            .compose({

                val models = it.ofType(UiModel.Model::class.java)
                        .replay(1)
                        .autoConnect()

                val navigation = it.ofType(UiModel.Navigation::class.java)

                Observable.merge(models, navigation)

            })

现在让我们订阅...

    val disposable = pipeline.subscribe {
        println("First subscriber: ${it.javaClass.simpleName}")
    }

    subject.onNext(UiModel.Model())
    subject.onNext(UiModel.Model())
    subject.onNext(UiModel.Navigation())

    disposable.dispose()


    val disposable1 = pipeline.subscribe { println("Second subscriber: ${it.javaClass.simpleName}") }

    subject.onNext(UiModel.Navigation())

    disposable1.dispose()

    val disposable2 = pipeline.subscribe { println("Third subscriber: ${it.javaClass.simpleName}") }
    disposable2.dispose()

输出:

第一位订阅者:模型

第一位订阅者:模型

第一位订阅者:导航

第二个订户:型号

第二个订阅者:导航

第三位订户:型号

但是,如果将内部转换器转换为使用如下发布方式多播可观察到的上游发射的转换器,则:

    val pipeline2 = subject
            .compose({

                it.publish {

                    val models = it.ofType(UiModel.Model::class.java)
                            .replay(1)
                            .autoConnect()

                    val navigation = it.ofType(UiModel.Navigation::class.java)

                    Observable.merge(models, navigation)
                }

            })

现在,如果我们以完全相同的方式进行订阅... ...与上述相同...

输出为:

第一位订阅者:模型

第一位订阅者:模型

第一位订阅者:导航

第二个订阅者:导航

第一个行为是正确的,我只想在取消订阅和再次订阅时重播最后一个Model对象。由于某些原因,使用发布时此方法不起作用,因此不会重播任何内容。我不明白为什么。请帮忙:)

预先感谢您的帮助。

0 个答案:

没有答案