Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자이야기

ReactiveX Subject 본문

ReactiveX/Subject

ReactiveX Subject

개발자가되고싶어 2021. 6. 20. 19:04
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 공부를 시작하며 작성하였습니다.

이상한점이나 궁금한점은 언제든지 말씀해주세요!