2021/02/10 - [Rx] - RxJava - Part 5. Hot Observable, Cold Observable
위의 포스트에서 공부했던 Part 5.에서 Subject에 대해 콜드 Observable을 핫 Observable로 바꾸어 준다고 언급했었습니다. Subject에 대해 공부해보려고 합니다.
Subject Class
Subject 클래스는 Observable의 속성, 구독자의 속성을 모두 가집니다. 즉 데이터를 발행할 수 있으면서, 데이터를 받아 처리도 할 수 있습니다.
Subject Class의 종류
AsyncSubject, BehaviorSubject, PublishSubject, ReplaySubject 등이 있습니다.
AsyncSubject Class
Observable에서 발행한 마지막 데이터를 얻어올 수 있는 Subject 클래스로, 완료되기 전 마지막 데이터에만 포커스를 두며, 이전 데이터들은 무시합니다.
위 설명을 보면 첫 구독자가 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는 구독 시점에서의 가장 최근 값 또는 기본값을 넘겨주는 클래스 입니다.
첫번째 구독자는 기본값인 핑크 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 마블다이어그램의 결과를 확인할 수 있습니다.
'Rx' 카테고리의 다른 글
RxKotlin- Part 8. Reactive 연산자 (0) | 2021.04.15 |
---|---|
RxKotlin- Part 7. ConnectableObservable Class (0) | 2021.03.09 |
RxKotlin- Part 5. Hot Observable, Cold Observable (0) | 2021.02.10 |
RxKotlin- Part 4. Observable 외 다른 스트림 (Single , Maybe) (0) | 2021.02.04 |
RxKotlin- Part 3. Observable 생성 (fromFuture, fromPublisher) (0) | 2021.01.31 |