2017-08-05 28 views
5

Próbuję zrozumieć cel tej biblioteki przez Jake Warthon: https://github.com/JakeWharton/RxRelayRxJava Relay vs Przedmioty

Zasadniczo: Przedmiotem wyjątkiem bez możliwości wywołania onComplete lub onError. Przedmioty są bardzo szkodliwe dla stanu: po otrzymaniu onComplete lub onError przestają być przydatne do przenoszenia danych.

Wpadam na pomysł, jest to ważny przypadek użycia, ale powyższe wydaje się łatwe do osiągnięcia po prostu przy użyciu istniejących obiektów.

1. nie przesyłać errors/completions zdarzenia do tematu:

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

2. Nie wystawiać przedmiot, zrobić podpis sposób zauważalny powrót zamiast.

fun(): Observable<> { return subject }

Ja oczywiście brakuje czegoś tutaj i jestem bardzo osobliwości na temat tego, co to jest!

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 
} 

Odpowiedz

2

subscribe ma przeciążeń i zazwyczaj ludzie przyzwyczajają się do przeciążenia subscribe(Consumer). Następnie używają tematów i nagle wywoływany jest także onComplete. RxRelay zapisuje użytkownika, który nie myśli o różnicy między subscribe(Consumer) i subscribe(Observer).

  1. Nie przekazania Uzupełnienia błędów/zdarzeń do tematu:

Rzeczywiście, ale na podstawie naszych doświadczeń z początkujących, często nie myślą o tym, a nawet wiedzieć dostępne metody do rozważenia.

  1. Nie wolno wystawiać tematu, spraw, by podpis metody zwracał się do obserwowalnego.

Jeśli potrzebujesz sposobu na przesłanie przedmiotu do tematu, to nie działa. Celem jest wykorzystanie podmiotu do rozsyłania grupowego przedmiotów, czasami z innego numeru Observable. Jeśli masz pełną kontrolę nad emisjami przez Subject, powinieneś mieć przyzwoitość nie dzwoniąc pod numer onComplete i nie pozwalając, aby cokolwiek innego to zrobiło.

+0

Dzięki akarnokd, Dobrze wiedzieć, że niczego mi nie brakuje :) Odnosząc się do # 2, jeśli umieścisz swój przedmiot w klasie otoki, możesz mieć metodę accept (przedmiot) {subject.omNext (item)}. I Temat pozostaje prywatnym polem – feresr

+0

Czy jesteś pewien, że to jedyny powód? Stworzenie zupełnie nowej biblioteki, aby uniknąć błędów początkujących, wydaje się przesadą. Więc importujesz go do swoich projektów. – feresr

+0

Masz na myśli [to] (https://github.com/JakeWharton/RxRelay/issues/30)? Ponieważ elementy wewnętrzne są w większości takie same, jak standardowe obiekty, a usunięcie obsługi zdarzeń terminalowych nie jest znaczącą wygraną wydajnościową, pozostawia nam to, co napisałem. – akarnokd