Behavior Subject
BehaviorSubject는 PublishSubject와는 다르게 초기값을 가지고 시작한다.
다만, 그 초기값이 매번 일정한 것이 아닌 가장 마지막에 방출되었던 값이 초기값으로 지정된다.
이를 그림으로 확인하면 아래와 같다.
-> Observable을 제일 처음 구독하는 구독자는 설정해준 초기 값으로 시작을 하게 되고, 그 다음구독자 부터는 구독하기 직전에 방출되었던 값으로 시작을 하게 된다.
코드로 구현하면 아래와 같다.
let behaviorSubject = BehaviorSubject<String>(value: "난 초기값이 있지롱")
BahaviorSubject는 항상 초기값을 가지고 시작하기 때문에 초기화하는 방식도 PublishSubject와 조금 다르다.
이런식으로 초기화 할 때 제일 처음 구독하는 구독자를 위해서 value: 에 초기값을 넣어줘야 한다.
그리고 아무런 이벤트를 방출하지 않은채로 구독을 하면,
behaviorSubject.subscribe(onNext: { element in
print(element)
}).disposed(by: disposeBag)
// 난 초기값이 없지롱
이렇게 출력되는 것을 볼 수 있다. (value로 설정한 초기값이 방출된 것을 볼 수 있다.)
그리고 이어서 이벤트를 방출하면
behaviorSubject.onNext("hi!")
behaviorSubject.onNext("last element")
그리고 다시 새롭게 behaviorSubject를 구독하면
// last element
가장 마지막으로 방출한 last element라는 요소가 전달 된 것을 확인할 수 있다.
let behaviorSubject = BehaviorSubject<String>(value: "난 초기값이 있지롱")
behaviorSubject.subscribe(onNext: { element in
print(element)
}).disposed(by: disposeBag)
// "난 초기값이 있지롱"
behaviorSubject.onNext("hi!")
behaviorSubject.onNext("last element")
behaviorSubject.subscribe(onNext: { element in
print(element)
}).disposed(by: disposeBag)
// "last element"
사용 예시
이렇게 구독하게되면 항상 초기값을 가지고 시작하는 BehaviorSubject는 새로운 정보를 불러오기 전에 가장 최신의 데이터를 사용하여 placeholder처럼 사용할 때 유용하다.
예를들면 어떤 이미지를 호출해주는 BehaviorSubject가 있고 해당 BehaviorSubject를 이미지뷰와 바인딩 시켰을 때 가장 최근에 불려왔었던 이미지를 미리 채워둠으로서 로딩하는 모습을 감추고 싶다하는 시나리오에 매우 유용하게 사용될 수 있다.
초기값이 있는 Subject라고 할 수 있다.
- 하나의 초기값을 가진 상태로 시작하고 등록된 Subscriber에게 (초기값 혹은)최신값을 방출하는 Subject이다.
- 마지막 .next 이벤트를 새로 등록된 Subscriber에게 반복한다는 점만 제외하면 PublisherSubject와 유사합니다.
- 위 그림처럼 각 Subscriber는 구독하기 전에 방출된 값들부터 수신한다.
- completed와 error 이벤트(완전 종료 이벤트)가 발생한 이후에 새로 구독한 Subscriber가 있다면 해당 Subscriber에게도 정보가 전달된다.
- 뷰를 가장 최신의 데이터로 채울 때 사용하기 좋다.
- 예를 들어 유저 프로필 화면을 BehaviorSubject를 통해 바인드해놓으면, 특정 값을 새롭게 가져오는 도중에도 초기값 혹은 최신값으로 화면을 항상 채워놓을 수 있다.
🔥 정리
Subject를 구독할 때 가장 최근에 불려와졌던 값을 가지고 처리하고 싶은 경우에 BehaviorSubject를 사용하면 된다.
(가장 최근 값을 가져와야 하므로 아무런 이벤트를 방출하지 않아도 값이 필요하여 초기값이 있는 Subject라고 볼 수 있다.)
참고
'Swift > RxSwift' 카테고리의 다른 글
[🔥Rx뿌셔] Relay (0) | 2022.10.31 |
---|---|
[🔥Rx뿌셔] Subject - Replay Subject (0) | 2022.10.31 |
[🔥Rx뿌셔] Subject - Publish Subject (0) | 2022.10.31 |
[🔥Rx뿌셔] Hot Observable VS Cold Observable (0) | 2022.10.31 |
[RxSwift] Rx+MVVM으로 로그인 화면을 만들어보자. (0) | 2022.10.31 |