2017-08-05 90 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