ReactiveX 공부를 시작하며 간단하게 Subject의 항목들과 작동 방식에 대해 알아볼까 합니다.
AsyncSubject
AsyncSubject는 방출된 최종값만을 받는다. subject.onComplete 호출 직전의 onNext 값만을 받을 수 있음.
다른 subject 들과는 다르게 subject.complete() 함수를 호출하는 순간 데이터 발행이 이루어진다.
fun subject() {
val subject: AsyncSubject<String> = AsyncSubject.create()
subject.subscribe { println("첫번째 구독 $it") }
subject.onNext("1")
subject.onNext("2")
subject.onNext("3")
subject.onNext("4")
subject.onNext("5")
subject.subscribe { println("두번째 구독 $it") }
subject.onComplete()
}
결과값
첫번째 구독 5
두번째 구독 5
BehaviorSubject
BehaviorSubject는 PublishSubject와 크게 다르지 않으나 새로운 구독이 시작되는 시점에(마블다이어그램 초록색 구, 분홍색 구 이후) 이전에 발행되었던 값을 받아올 수 있다.
fun subject() {
val subject: BehaviorSubject<String> = BehaviorSubject.create()
subject.subscribe { println("첫번째 구독 $it") }
subject.onNext("1")
subject.onNext("2")
subject.onNext("3")
subject.onNext("4")
subject.onNext("5")
subject.subscribe { println("두번째 구독 $it") }
}
결과값
첫번째 구독 1
첫번째 구독 2
첫번째 구독 3
첫번째 구독 4
첫번째 구독 5
두번째 구독 5
PublishSubject
단순히 구독을 시작한 시점에서 방출된 값을 받을 수 있음. 그렇기에 구독이 시작되기 전의 방출된 값은 손실될 위험이 있다.
fun subject() {
val subject: PublishSubject<String> = PublishSubject.create()
subject.subscribe { println("첫번째 구독 $it") }
subject.onNext("1")
subject.onNext("2")
subject.onNext("3")
subject.onNext("4")
subject.subscribe { println("두번째 구독 $it") }
subject.onNext("5")
}
결과값
첫번째 구독 1
첫번째 구독 2
첫번째 구독 3
첫번째 구독 4
첫번째 구독 5
두번째 구독 5
ReplaySubject
ReplaySubject는 구독하는 시기에 관계없이 구독 시작 전 또는 후에 방출된 모든 값을 받을 수 있다.
fun subject() {
val subject: ReplaySubject<String> = ReplaySubject.create()
subject.subscribe { println("첫번째 구독 $it") }
subject.onNext("1")
subject.onNext("2")
subject.onNext("3")
subject.onNext("4")
subject.onNext("5")
subject.subscribe { println("두번째 구독 $it") }
}
결과값
첫번째 구독 1
첫번째 구독 2
첫번째 구독 3
첫번째 구독 4
첫번째 구독 5
두번째 구독 1
두번째 구독 2
두번째 구독 3
두번째 구독 4
두번째 구독 5
간단한 Subject 사용법을 알아봤습니다. ReactiveX 공부를 시작하며 작성하였습니다.