본문 바로가기

Rx

RxKotlin- Part 4. Observable 외 다른 스트림 (Single , Maybe)

728x90

Single

Observale은 무한한 데이터 발행이 가능하지만, Single class는 오직 1개만 발행하도록 되어있으며, 발행과 동시에 종료가 되고 종료시 onSuccess가 호출됩니다.

 

Single class는 Observable과 같은 방법으로 활용할 수 있습니다.

import io.reactivex.Single
import io.reactivex.functions.Consumer
import io.reactivex.rxkotlin.subscribeBy

fun main() {
    val single = Single.just("Single class")
    single.subscribe { data -> println(data) }
    //or
    single.subscribeBy(
        onSuccess = { println(it) }
    )
    //or
    single.subscribe(Consumer<String>() { t -> println(t) })
}

실행결과:

Single class
Single class
Single class

 

Single class는 Observable과 함께 사용할 수 있습니다.

fun main() {
    //Single class를 Observable을 이용해 생성
    val source_1 = Observable.just("Single class")
    Single.fromObservable(source_1).subscribe { it -> println(it) }

    //Observable의 just에서 single 함수를 통한 생성
    Observable.just("Single class")
        .single("default")
        .subscribe { it -> println(it) }

    //값이 없는 데이터로 Single 호출 시 defaultItem 출력
    Observable.empty<Any>().single("default").subscribe { it -> println(it) }

    // 만약 take를 2로 하면 onError가 호출된다.
    Observable.just("Item1", "Item2").take(1).single("Default Id")
        .subscribeBy(
        onError = { println("onError") },
        onSuccess = { println(it) }
        )
}

실행결과:

Single class
Single class
default
Item1

위 코드에서 중요한 점은 Single class는 오직 1개의 데이터만 발행할 수 있다는 점이다. 만약 take(1)을 take(2)로 변경하여 실행하게되면 onError가 호출되게 됩니다.

 

Maybe

Maybe는 Observable의 또 다른 특수 형태로 데이터를 하나만 가질 수 있다는 부분에서 Single class와 비슷하지만, 1개를 발행해야하는 Single 클래스와 달리 아이템을 발행하거나, 발행하지 않을 수도 있다는 점에서 차이가 있습니다.

Single 클래스에 onComplete 이벤트가 추가된 형태 입니다. 아이템을 발행했을 경우엔 onSuccess()를 호출하고, 발행하지 않을 때에는 onComplete()를 호출합니다.

 

onSuccess() 이후에는 다시 onComplete()를 호출할 필요가 없습니다.

Maybe 역시 연산자를 통해 Observable과 서로 변환될 수 있습니다.

 

observable.firstElement()

maybe.toObservable()