본문 바로가기

Rx

RxKotlin- Part 6. Subject Class

728x90

2021/02/10 - [Rx] - RxJava - Part 5. Hot Observable, Cold Observable

 

RxJava - Part 5. Hot Observable, Cold Observable

Cold Observable Observable은 Hot, Cold로 볼 수 있습니다. 콜드 Observable은 Observable을 선언하고 just(), from...() 함수를 호출해도 Observer(옵저버)가 subscribe() 함수를 호출해 구독하지 않으면 데이터..

goni95.tistory.com

위의 포스트에서 공부했던 Part 5.에서 Subject에 대해 콜드 Observable을 핫 Observable로 바꾸어 준다고 언급했었습니다. Subject에 대해 공부해보려고 합니다.

 

Subject Class

Subject 클래스는 Observable의 속성, 구독자의 속성을 모두 가집니다. 즉 데이터를 발행할 수 있으면서, 데이터를 받아 처리도 할 수 있습니다.

 

Subject Class의 종류

AsyncSubject, BehaviorSubject, PublishSubject, ReplaySubject 등이 있습니다.

 

AsyncSubject Class

Observable에서 발행한 마지막 데이터를 얻어올 수 있는 Subject 클래스로, 완료되기 전 마지막 데이터에만 포커스를 두며, 이전 데이터들은 무시합니다.

 

http://reactivex.io/RxJava/javadoc/rx/subjects/AsyncSubject.html

위 설명을 보면 첫 구독자가 subscribe()를 호출하고 적, 녹색 item이 발행됩니다. 두번째 구독자가 subscribe()를 호출한 후 마지막에 청색 item이 발행되고 데이터 발행을 완료(onComplete)

 

import io.reactivex.subjects.AsyncSubject

/** AsyncSubject */
fun main(){
    val subject = AsyncSubject.create<String>()
    subject.subscribe { data: String ->
        println("Subscriber 1 : $data")
    }
    subject.onNext("one")
    subject.onNext("two")
    subject.subscribe {
            data: String -> println("Subscriber 2 : $data")
    }
    subject.onNext("three")
    subject.onComplete()
}

실행결과:

Subscriber 1 : three
Subscriber 2 : three

위 실행결과를 보면 one, two를 발행하여도 완료전의 마지막으로 발행된 three가 출력되는 것을 확인할 수 있습니다. 만약 onComplete() 후에 새로운 item을 발행하였을때를 확인해보겠습니다.

 

 subject.onComplete()
    subject.onNext("last")
    subject.subscribe {
            data: String -> println("Subscriber 3 : $data")
    }

기존의 코드에서 위 코드를 추가해도 결과는 모두 three가 출력됩니다.

 

Subject 클래스는 구독자의 속성도 가지기 아래처럼 동작할 수 있습니다.

/** AsyncSubject 구독자 */
fun main(){
    val array = arrayOf(10, 20, 30, 40, 50)
    val mylist = array.toObservable()    //배열을 Observable로 변경

    val subject2 = AsyncSubject.create<Int>()
    subject2.subscribe { data: Int ->
        println("Subscriber 1 : $data")
        subject2.onComplete()
    }
    mylist.subscribe(subject2)
}

실행결과:

Subscriber 1 : 50
/** AsyncSubject 구독자 */
fun main(){
    val array = arrayOf(10, 20, 30, 40, 50)
    val mylist = array.toObservable()    //배열을 Observable로 변경

    val subject2 = AsyncSubject.create<Int>()
    subject2.subscribe { data: Int ->
        println("Subscriber 1 : $data")
        subject2.onComplete()
    }
    subject2.onNext(60)
    subject2.onComplete()
    mylist.subscribe(subject2)
}

실행결과:

Subscriber 1 : 60

 

BehaviorSubject

BehaviorSubject는 구독 시점에서의 가장 최근 값 또는 기본값을 넘겨주는 클래스 입니다.

 

http://reactivex.io/documentation/ko/subject.html

첫번째 구독자는 기본값인 핑크 item을 받고, 빨간, 초록 item이 발행되고 두번째 구독자가 구독전 가장 최신 값이 초록 item을 받고 두 구독자 모두 파랑 item을 받습니다. 즉 가장 최신값을 받으며, 완료 시 마지막 데이터를 받는 AsyncSubject와의 차이점을 확인할 수 있습니다.

 

/** BehaviorSubject 구독자 */
fun main(){
    val subject = BehaviorSubject.createDefault("pink")
    subject.subscribe { data : String ->
        println("Subscribe 1 : $data")
    }
    subject.onNext("red")
    subject.onNext("green")
    subject.subscribe { data : String ->
        println("Subscribe 2 : $data")
    }
    subject.onNext("blue")
    subject.onComplete()
}

실행결과:

Subscribe 1 : pink
Subscribe 1 : red
Subscribe 1 : green
Subscribe 2 : green
Subscribe 1 : blue
Subscribe 2 : blue

위의 코드를 확인하면 Behavior 마블다이어그램의 결과를 확인할 수 있습니다.