Domain/ReactiveX

[ReactiveX] Single

by Donghwan 2021. 4. 29.

Observable의 특수한 형태입니다. Observable 클래스는 데이터를 무한하게 발행할 수 있지만 Single 클래스는 오직 1개의 데이터만 발행하도록 한정합니다. 보통 결과가 유일한 서버 API를 호출할 때 유용하게 사용할 수 있습니다. 또한 Observable의 특수한 형태이기 때문에 Observable와 사용법이 거의 동일합니다.

중요한 것은 데이터 하나가 발행과 동시에 종료(onSuccess)된다는 부분입니다. 라이프 사이클 관점에서 보면 onNext()와 onComplete() 함수가 onSuccess() 힘수로 통합된 것입니다. 따라서 Single 클래스의 라이프 사이클 함수는 onSuccess(T value) 함수와 onError() 함수로 구성됩니다.

  • onSubscribe(d: Disposable)
    Single이 데이터를 전달 할 준비가 되면 이 함수를 호출합니다.
    Single과 연결을 취소할 수 있는 Disposable을 파라미터로 전달합니다.
  • onSuccess(t: T)
    Single은 자신이 배출하는 하나의 값을 이 메서드를 통해 전달합니다.
    이 함수가 호출되면 Single이 완료 된 것을 의미합니다.
  • onError(e: Throwable)
    Single은 항목을 배출할 수 없을 때 이 메서드를 통해 Throwable 객체를 전달합니다.
    이 함수가 호출되면 Single이 완료 된 것을 의미합니다.

 

Observable에서 Single 클래스 사용

Single은 Observable의 특수한 형태이므로 Observable에서 변환할 수 있습니다.

// 1. 기존 Observable에서 Single 객체로 변환하기.
// 기존 Observable에서 첫 번째 값을 발행하면 onSuccess 이벤트를 호출한 후 종료합니다.
Observable〈String> source = Observable.just("Hello Single"); 
Single.fromObservable(source).subscribe(System.out::println);

// 2. single() 함수를 호출하여 Single 객체 생성하기.
// single() 함수는 default value를 인자로 갖습니다. 
// Observable에서 값이 발행되지 않을 때도 인자로 넣은 기본값을 대신 발행합니다.
Observable.just("Hello Single")
.single("default item")
.subscribe(System.out::println);

// 3. first() 함수를 호출하여 Single 객체생성하기.
// first() 함수를 호출하면 Obsevable이 Single 객체로 변환됩니다. 
// 또한 하나 이상의 데이터를 발행하더라도 첫 번째 데이터 발행 후 onSuccess 이벤트가 발생합니다.
String[] colors = {"Red", "Blue", "Gold"}; 
Observable.fromArray(colors)
.first("default value")
.subscribe(System.out::println);

// 4. empty Observable에서 Single 객체 생성하기.
// 첫 번째 데이터 발행 후 onSuccess 이벤트가 발생한다는 점은 같습니다.
// 값이 발행되지 않을 때도 기본값을 갖는 Single 객체로 변환할 수 있습니다.
Observable.empty()
.single("default value")
.subscribe(System.out::println);

// 5. take() 함수에서 Single 객체 생성하기.
Observable.just(new Order("ORD-1"), new 0rder("0RD-2"))
.take(1)
.single(new Order("default order"))
.subscribe(System.out::println);

 

Single 클래스의 올바른 사용

Single로 선언된 인스턴스에 just() 함수로 여러 개 값을 넣어보면 아래와 같은 에러가 발생합니다.

java.lang.IllegalArgumentException: Sequence contains more than one element!

에러 메시지는 두 번째 값을 발행하면서 onNext 이벤트가 발생할 때 에러가 발생했다고 알려줍니다.

 

[ 출처 : RxJava 프로그래밍 ]

728x90
반응형

'Domain > ReactiveX' 카테고리의 다른 글

[ReactiveX] ConnectableObservable  (0) 2021.04.29
[ReactiveX] Subject  (0) 2021.04.29
[ReactiveX] Cold Observable Vs Hot Observable  (0) 2021.04.29
[ReactiveX] Maybe  (0) 2021.04.29
[ReactiveX] Observable  (0) 2021.04.29

댓글