본문 바로가기

Swift/RxSwift

[🔥Rx뿌셔] Subject - BehaviorSubject

728x90

Behavior Subject 

BehaviorSubjectPublishSubject와는 다르게 초기값을 가지고 시작한다. 

다만, 그 초기값이 매번 일정한 것이 아닌 가장 마지막에 방출되었던 값이 초기값으로 지정된다.

 

 

이를 그림으로 확인하면 아래와 같다.

-> 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라고 볼 수 있다.)

 

참고

https://github.com/fimuxd/RxSwift/blob/master/Lectures/03_Subjects/Ch3.%20Subjects.md#d-behaviorsubjects%EB%A1%9C-%EC%9E%91%EC%97%85%ED%95%98%EA%B8%B0

 

GitHub - fimuxd/RxSwift: RxSwift를 스터디하는 공간

RxSwift를 스터디하는 공간. Contribute to fimuxd/RxSwift development by creating an account on GitHub.

github.com