2017-08-05 88 views
5

我想通过杰克Warthon了解这个库的目的: https://github.com/JakeWharton/RxRelayRxJava继电器VS主题

基本上是:除了没有来电的onComplete或 onError的能力的主题。受试者处于有害的状态:当他们收到onComplete或onError时,他们不再可用于移动数据。

我明白了,这是一个有效的使用案例,但上述使用现有主题似乎很容易实现。

不要转发errors/completions事件的主题:

`observable.subscribe({ subject.onNext(it) }, { log error/throw exception },{ ... })` 

2.不要暴露的问题,让你的方法签名返回一个可观察的来代替。

fun(): Observable<> { return subject }

我显然失去了一些东西,我它是什么非常珍玩!

class MyPublishRelay<I> : Consumer<I> { 

    private val subject: Subject<I> = PublishSubject.create<I>() 

    override fun accept(intent: I) = subject.onNext(intent) 

    fun subscribe(): Disposable = subject.subscribe() 
    fun subscribe(c: Consumer<in I>): Disposable = subject.subscribe(c) 
    //.. OTHER SUBSCRIBE OVERLOADS 
} 

回答

2

subscribe具有过载而不同,通常人们习惯了subscribe(Consumer)超载。然后他们使用主题并突然onComplete也被调用。 RxRelay可以帮助用户避免使用subscribe(Consumer)subscribe(Observer)之间的差异。

  1. 不要转发错误/完井事件的主题:

确实,但基于我们的经验的初学者,他们往往不考虑这个,甚至不知道有关可用的方法来考虑。

  1. 不要暴露主题,让你的方法签名返回一个observable。

如果您需要一种将项目发送到主题的方法,则这不起作用。目的是使用该主题执行项目多播,有时来自另一个Observable。如果您完全控制了通过Subject的排放量,那么您应该保持不要致电onComplete的正当性,并且不要让其他任何事情做到这一点。

+0

谢谢akarnokd,很高兴知道我没有遗漏任何东西:)关于#2,如果你把你的主题放在包装类中,你可以有一个方法accept(item){subject.omNext(item)}。而主题仍然是一个私人领域 – feresr

+0

你确定这是唯一的原因,但?为了避免初学者的错误而创建一个全新的图书馆看起来像是矫枉过正。所以将它导入到你的项目中 – feresr

+0

你的意思是[this](https://github.com/JakeWharton/RxRelay/issues/30)?由于内部结构大部分与标准主体相同,并且取消终端事件处理并不是一个重要的性能优势,这使我们得到了我所写的内容。 – akarnokd