Observer와 Subscriber의 차이점은 무엇입니까?


83

다음 기능을 해독하려고합니다.

Subscription getCar(id, Observer<Car> observer) {
    return getCarDetails(id, new Observer<CarDetails> {
                             @Override
                             onNext(CarDetails details) {           
                                 observer.onNext(details.getCar());
                             } });
}

http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/ 에서 rxjava에 대한 좋은 소개를 받았지만 통과시 Observer 만 언급했으며 대부분의 구독자를 사용할 것이라고 말했습니다. Observable에서 방출되는 소비자 항목까지의 시간.

누군가 나에게 설명 할 수 있습니까?

  1. 관찰자는 무엇입니까?
  2. 관찰자는 구독자와 어떻게 다릅니 까?
  3. 위의 코드 조각은 무엇을합니까?

Javadoc 은 마치 구독자처럼 보이게 만들었습니다. 구독자를위한 javadoc은 관찰자와 구독을 구현한다고 말합니다. 나 엄청 혼란스러워.


그것은이다 옵저버 대 패턴 게시 / 가입 . 비슷하지만 미묘한 차이가 있습니다.
Sean Patrick Floyd

4
@SeanPatrickFloyd : 차이점을 설명해 주시겠습니까?
user541686 dec.

'세부 정보'변수는 무엇입니까?
Marian Paździoch

답변:


63

편집 : @Alrid의 코멘트

tl; dr

public abstract class Subscriber<T> implements Observer<T>, Subscription

따라서 Subscriber구독 에 대한 추가 의미 가있는 Observer 의 구현입니다 (구독 취소에 대한 자세한 내용). 귀하의 질문에있는 코드 Observer는 구현 (일반적인 프로그래밍 관행) 대신 인터페이스를 전달한다는 것을 보여줍니다 .

또한이 코드는를 반환합니다 Subscription. 이는이 코드의 작성자가 Subscriptionobservable에 의해 생성 된 요소에 대한 액세스없이 클라이언트가 메서드 에만 액세스해야한다고 생각했기 때문일 수 있습니다 . 프로그래머 오류 일 수 있습니다.

긴 이야기

이 웹 사이트 (또는 책)의 내용을 읽어야합니다. http://www.introtorx.com Rx.Net에 관한 내용이지만 개념은 매우 동일하며 Erik Meijer와 RxJava 구현자가 그 뒤를 따랐 습니다 ( Java 언어에 해당되는 경우).

이 페이지는 당신의 관심을 끌 것입니다 (두 번째 장입니다) : KeyTypes

여기 첫 번째 단락에서 읽을 것입니다.

Rx로 작업 할 때 이해해야 할 두 가지 주요 유형과 Rx를보다 효과적으로 학습하는 데 도움이되는 보조 유형의 하위 집합이 있습니다. IObserver 및 IObservable은 Rx의 기본 빌딩 블록을 형성하는 반면 ISubject의 구현은 Rx를 처음 사용하는 개발자의 학습 곡선을 줄입니다.

...

본질적으로 Rx는 Observer 패턴의 기초 위에 구축됩니다. .NET은 이미 멀티 캐스트 대리자 또는 이벤트 (일반적으로 멀티 캐스트 대리자)와 같은 Observer 패턴을 구현하는 몇 가지 다른 방법을 제공합니다.

유형 / API가 약간 다르더라도이 책을 통해 많은 것을 배울 수 있습니다. 아마도 일부 블로그보다 훨씬 더 많이 배울 것입니다.

이 말하지 않는 것 ( ... RxJava 구현에 있기 때문에 )

이때 RxJava 메인 개발자는 두 가지 유형의 계약을 구분할 수 있는 약간의 변형 (PR # 792 참조 )을 도입했습니다 .

  • 알림-> Observer
  • (un) 구독-> Subscription

이 변경으로 인해 RxJava 라이브러리의 구현 클래스에 대한 이러한 우려를 더 잘 표현 / 분할 할 수 있습니다.

그러나 라이브러리 사용자로서 RxJava 라이브러리의 실제 구현을 사용하는 것으로 충분합니다.

구독자를 구현하려면 훨씬 더 많은 지식, 작업 및 관리가 필요합니다. 실제로 구독 의미는 관찰 가능한 소스의 유형에 따라 매우 중요합니다 (핫 또는 콜드? 생성 비용이 많이 듭니까?)


위와 같은 경우가 Subscriber아닌 노출 Observer은 대부분의 경우 코드를 방해하지 않지만 구독 취소 의미가 필요하지 않는 한 의도 된 용도가 아닙니다. 그러나 결국,를 구현하면 다음 Subscriber과 같은 일부 함정에 빠질 수 있습니다.

  1. 사용하지 않을 기능에 리소스를 소비
  2. 다른 클래스에서 상속 할 수 없습니다.
  3. 부정확 한 탈퇴 코드 작성
  4. 잘못된 코드 또는 다른 컨텍스트 용으로 작성된 올바른 코드 복사 / 붙여 넣기

1
2.x에서 Observer는 Observable을 구독하는 데 사용되며 Subscriber는 Flowable을 구독하는 데 사용되며, 구독자는 더 이상 Observer를 구현하지 않습니다. github.com/ReactiveX/RxJava/issues/4515
sarvesh chavan

40

(편집 : 이것은 분명히 RxJava 1에만 해당됩니다.)

  1. Observer데이터 소스 (AN에서 데이터를 얻을 수있는 객체이다 Observable). 데이터 소스는 관찰자의 onNext().

  2. A Subscriber는 인터페이스를 Observer통해 해당 데이터 소스에서 구독을 취소 할 수도 있습니다 Subscription.

  3. getCar()함수는 자동차를 반환하려고하지만이를 수행하는 직접적인 방법은 없습니다. 그러나 getCarDetails()모든 자동차 세부 사항을 관찰자를 호출하는 자동차 세부 사항 ( ) 을 가져 오는 기능이 있습니다. 그래서 그것은 그 함수를 호출하고 데이터를 얻을 때, 세부 사항에서 자동차 데이터를 가져 와서 자신의 관찰자에게 전달할 관찰자에게 전달합니다.


2
이것은 RxJava 2에서는 사실이 아니며, 구독자와 관찰자는 완전히 다른 두 인터페이스입니다. 둘 다 다른 것을 확장하지 않습니다
FRR


3

또한 RxJava2 에서 구독을 취소하려면 ResourceObserverfor ObservableResourceSubscriberfor 를 사용해야합니다 Flowable.

질문 확인

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.