[RxSwift] 4-2. BehaviorSubject

miori·2022년 2월 10일
0

RxSwiftBasic

목록 보기
8/29
post-thumbnail

RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀


BehaviorSubject

소개

BehaviorSubject는 생성이 될때, PublishSubject와 달리 초기값을 지정한다.
그리고 구독 시, 가장 마지막 최신 이벤트를 전달한다.

마블 다이어그램

BehaviorSubject
☄️ 형광펜처리된부분이 핵심인것 같다. ☄️

특징

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의 특징을 고려해 언제 사용하면 좋을지 고민해보았다.

  • 초기값을 포함해 값을 비교하고 싶을때.
    - 앞선 Observable과 Subject를 비교해보는 글에서 BehaviorSubject를 미리 사용했었다. 이메일 포맷인지 검사하기 위해 "@" 의 포함여부를 검사하는 과정이었다.
    실제 유저가 텍스트필드에 입력을 한다 가정했을때, 초기에는 비어있는 텍스트필드이기때문에 "@"가 포함되어 있지 않음을 알려줘야한다.
    그렇다면 bool값을 통해 false이면 텍스트필드 밑에 옳지않은 이메일형식이라고 label를 추가할 수 있다. 그리고 "@"를 포함하여, true가 된다면 옳은 형식이라고 label를 변경하거나 숨기면서 ui의 변화를 줄 수 있을 것이다.
    따라서 이런 경우 BehaviorSubject를 사용하면 좋을것 같다고 생각한다.

이번에 BehaviorSubject에 대해 정리하고 고민한 흔적을 남겨보았다.

다음엔, 앞서 PublishSubject에서 발생할 수 있는 이슈(=생성과 구독사이에 전달되는 이벤트 사라질 수 있음)에 대응할 수 있는 ReplaySubject에 대해 정리해보겠다.

profile
iS를 공부하는 miori 입니다.

0개의 댓글

관련 채용 정보