[RxSwift] BehaviorSubject

2025. 1. 10. 23:29iOS

반응형

BehaviorSubject는 RxSwift에서 제공하는 Subject 중 하나로, 현재 상태를 나타내거나 초기 값을 지정할 때 유용합니다. 구독자가 구독을 시작하면, 항상 가장 최근의 값을 즉시 받을 수 있다는 특징이 있습니다.

주요 특징

  1. 초기값: BehaviorSubject는 반드시 초기 값을 가져야 합니다.
  2. 최근 값 유지: 항상 가장 최근 값을 보유하며, 새로운 구독자는 해당 값을 즉시 전달받습니다.
  3. 구독 중 전달: 새로운 값이 emit될 때마다 모든 구독자에게 전달됩니다.

사용 예제

초기화 및 기본 동작

import RxSwift 

// 초기값이 "Hello"인 BehaviorSubject 생성 
let subject = BehaviorSubject(value: "Hello") 

// 첫 번째 구독자 
subject.subscribe(onNext: { value in 
	print("Subscriber 1 received: \(value)") 
})
.disposed(by: DisposeBag()) 

// 새로운 값 전달 
subject.onNext("World") 

// 두 번째 구독자 

subject.subscribe(onNext: { value in 
	print("Subscriber 2 received: \(value)") 
})
.disposed(by: DisposeBag()) 
// 또 다른 값 전달 
subject.onNext("RxSwift")

출력 결과:

Subscriber 1 received: Hello 
Subscriber 1 received: World 
Subscriber 2 received: World 
Subscriber 1 received: RxSwift 
Subscriber 2 received: RxSwift

주요 메서드

  • onNext(_:): 새 값을 발행합니다.
  • onError(_:): 에러를 발행하고 모든 구독을 종료합니다.
  • onCompleted(): 완료 이벤트를 발행하고 모든 구독을 종료합니다.
  • value: 현재 값을 동기적으로 가져올 수 있습니다.

주의 사항

  • value 프로퍼티는 try!를 동반할 수 있는 API이므로, 주의해서 사용해야 합니다. 값이 없거나 에러 상태일 경우 호출 시 크래시가 발생할 수 있습니다.
do { 
	let currentValue = try subject.value() 
    print("Current value is \(currentValue)") 
} 
catch { 
	print("Error: \(error)") 
}

적합한 사용 사례

  • 상태 관리: UI 상태나 데이터의 현재 상태를 유지하고 공유하는 데 유용합니다.
  • 초기 값이 필요한 경우: ReplaySubject와 달리, 항상 초기 값을 요구하므로 초기 상태가 명확합니다.
  • 구독 시 최신 데이터가 필요한 경우: 예를 들어, 설정 화면에서 사용자의 현재 설정 값을 표시해야 하는 경우에 유용합니다.
반응형