Observer와 Subscriber의 차이점은 무엇입니까?
다음 기능을 해독하려고합니다.
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에서 방출되는 소비자 항목까지의 시간.
누군가 나에게 설명 할 수 있습니까?
- 관찰자는 무엇입니까?
- 관찰자는 구독자와 어떻게 다릅니 까?
- 위의 코드 조각은 무엇을합니까?
Javadoc 은 마치 구독자처럼 보이게했습니다. 구독자를위한 javadoc은 관찰자와 구독을 구현한다고 말합니다. 나 엄청 혼란스러워.
편집 : @Alrid의 코멘트
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
따라서 Subscriber 는 구독 에 대한 추가 의미 가있는 Observer 의 구현입니다 (구독 취소에 대한 자세한 내용). 귀하의 질문에있는 코드 Observer
는 구현 (일반적인 프로그래밍 관행) 대신 인터페이스를 전달한다는 것을 보여줍니다 .
또한이 코드는를 반환합니다 Subscription
. 이는이 코드의 작성자가 Subscription
observable에 의해 생성 된 요소에 대한 액세스없이 클라이언트가 메서드 에만 액세스해야한다고 생각했기 때문일 수 있습니다 . 프로그래머 오류 일 수 있습니다.
긴 이야기
이 웹 사이트 (또는 책)의 내용을 읽어야합니다. 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
과 같은 일부 함정에 빠질 수 있습니다.
- 사용하지 않을 기능에 리소스를 소비
- 다른 클래스에서 상속 할 수 없습니다.
- 잘못된 탈퇴 코드 작성
- 잘못된 코드 또는 다른 컨텍스트 용으로 작성된 올바른 코드 복사 / 붙여 넣기
(편집 : 이것은 분명히 RxJava 1에만 해당됩니다.)
는
Observer
데이터 소스 (AN에서 데이터를 얻을 수있는 객체이다Observable
). 데이터 소스는 관찰자의onNext()
.A
Subscriber
는 인터페이스를Observer
통해 해당 데이터 소스에서 구독을 취소 할 수도 있습니다Subscription
.이
getCar()
함수는 자동차를 반환하려고하지만이를 수행하는 직접적인 방법은 없습니다. 그러나getCarDetails()
모든 자동차 세부 정보를 가진 관찰자를 호출하는 자동차 세부 정보 ( ) 를 가져 오는 기능이 있습니다. 그래서 그것은 그 함수를 호출하고 데이터를 얻을 때, 세부 사항에서 자동차 데이터를 가져 와서 자신의 관찰자에게 전달할 관찰자에게 전달합니다.
RxJava 2 org.reactivestreams.Subscriber
에서 Reactive Streams 사양을 준수하는 인터페이스 입니다.
가장 큰 차이점 Observable
은 새로운 Subscriber
기능이 배압을 지원 한다는 것 입니다.
Observer
에 구독 한되고 Observable
, 그리고 Subscriber
에 가입 Flowable
(구현 org.reactivestreams.Publisher
).
또한 RxJava2 에서 구독을 취소하려면 ResourceObserver
for Observable
및 ResourceSubscriber
for 를 사용해야합니다 Flowable
.
이 질문 확인
'Program Tip' 카테고리의 다른 글
GitHub 위키 디렉토리 (0) | 2020.10.12 |
---|---|
여러 bash 스크립트에서 pushd / popd 스택을 표시하지 마십시오 (quiet pushd / popd). (0) | 2020.10.12 |
표준 Windows .ini 파일이 주석을 허용합니까? (0) | 2020.10.12 |
SQL Server 2008 빈 문자열 대 공백 (0) | 2020.10.12 |
TimeZoneInfo를 사용하여 일광 절약 시간 동안 현지 시간을 얻는 방법은 무엇입니까? (0) | 2020.10.12 |