개발자이야기
ReactiveX Subject 본문
ReactiveX Subject
(AsyncSubject, BehaviorSubject, PublishSubject, ReplaySubject)
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 공부를 시작하며 작성하였습니다.
이상한점이나 궁금한점은 언제든지 말씀해주세요!