iOS/RxSwift

[RxSwift] Subject - BehaviorSubject

_Rey 2022. 9. 15. 13:00

PublishSubject와의 차이점

let publishSubject = PublishSubject<Int>()
publishSubject.subscribe {
    print("PublishSubject >>", $0)
}
.disposed(by: disposeBag)

위 코드는 Observer가 Subscribe한 이후 전달되는 이벤트가 없기 때문에 print가 호출되지 않는다.

 

https://reactivex.io/documentation/subject.html

BehaviorSubject는 구독 시점에 가장 최근에 배출된 항목을 배출한다.

 

let behaviorSubject = BehaviorSubject<Int>(value: 0)

behaviorSubject.subscribe {
    print("BehaviorSubject 1", $0)
}
.disposed(by: disposeBag)

// Output
BehaviorSubject 1 next(0)

BehaviorSubject는 생성 시, 파라미터를 받는다.

해당 파라미터를 통해 onNext 이벤트를 생성하고 저장해둔다.

이후 Observer가 Subscribe하자마자 저장해둔 이벤트를 전달하기 때문에 print가 호출된다.

 

behaviorSubject.onNext(1)

// Output
BehaviorSubject 1 next(1)

이벤트를 전달하고, 저장하기 때문에 onNext(1) 이 전달된 후에도 저장된다.

 

behaviorSubject.subscribe {
    print("BehaviorSubject 2", $0)
}

// Output
BehaviorSubject 2 next(1)

따라서 새로운 Observer가 Subscribe을 하자마자 마지막으로 저장(전달)된 이벤트가 전달된다.

 

https://reactivex.io/documentation/subject.html

behaviorSubject.onCompleted()

// Output
BehaviorSubject 1 completed
BehaviorSubject 2 completed

이벤트의 종류에 상관없이 마지막 이벤트를 저장하기 때문에

 

behaviorSubject.subscribe {
    print("BehaviorSubject 3", $0)
}

// Output
BehaviorSubject 3 completed

Completed 이벤트 또한 전달 후 저장하게 되고, 이후 모든 Observer가 Subscribe할 경우 Completed를 전달하게 된다.