RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀
BehaviorSubject는 생성이 될때, PublishSubject와 달리 초기값을 지정한다.
그리고 구독 시, 가장 마지막 최신 이벤트를 전달한다.
☄️ 형광펜처리된부분이 핵심인것 같다. ☄️
1. 초기 생성시 기본값이 있다.
2. 가장 최신이벤트를 Observer로 전달한다
마블 다이어그램에서 "a"가 초기값이라고 한다면, behaviorSubject이기 때문에 o1은 a이벤트도 받을수 있다.
만약 publishSubject였다면 o1은 아직 구독전이기 때문에 a를 받지 못했을 것이다.
마블 다이어그램을 코드로 표현해보았다.
전체코드
// PublishSubject와 달리, 생성시점에 event를 지정
let bs = BehaviorSubject<String>(value: "a")
bs.subscribe { print("observer1", $0) }
.disposed(by: disposeBag)
bs.onNext("b")
bs.onNext("c")
bs.subscribe { print("observer2", $0) }
.disposed(by: disposeBag)
bs.onNext("d")
//bs.onCompleted()
//bs.onError(Err.err)
bs.subscribe { print("observer3", $0) }
.disposed(by: disposeBag)
/*
output:
observer1 next(a) **
observer1 next(b)
observer1 next(c)
observer2 next(c) **
observer1 next(d)
observer2 next(d)
observer3 next(d) **
*/
output중에 임의로 표시한 ** 이 있는 세 output을 눈여겨 보면 BehaviorSubject의 특징을 확인 할 수 있다.
이때 만약 bs.onError(Err.err)
를 전달한다면, observer3은 next(d)
가 아닌, error(err)
를 받게된다. 왜냐하면, error를 전달한게 가장 최신의 마지막 이벤트 이기 때문이다.
bs.onError(Err.err)
이부분의 주석을 해제하고 실행했을때의 결과값에서 확인할 수 있다.
/*output when bs.onError(Err.err) :
observer1 next(a)
observer1 next(b)
observer1 next(c)
observer2 next(c)
observer1 next(d)
observer2 next(d)
observer1 error(err)
observer2 error(err)
observer3 error(err)
참고로 Err.err를 임의로 만든 Error Enum이고 전체코드에서 확인 가능하다.
다시 정리하자면 behaviorSubject는 최초 구독시 값을 바로 전달하고, 가장 최신의 마지막이벤트 값을 전달한다.
BehaviorSubject의 특징을 고려해 언제 사용하면 좋을지 고민해보았다.
이번에 BehaviorSubject에 대해 정리하고 고민한 흔적을 남겨보았다.
다음엔, 앞서 PublishSubject에서 발생할 수 있는 이슈(=생성과 구독사이에 전달되는 이벤트 사라질 수 있음)에 대응할 수 있는 ReplaySubject에 대해 정리해보겠다.