PublishSubject와의 차이점
let publishSubject = PublishSubject<Int>()
publishSubject.subscribe {
print("PublishSubject >>", $0)
}
.disposed(by: disposeBag)
위 코드는 Observer가 Subscribe한 이후 전달되는 이벤트가 없기 때문에 print가 호출되지 않는다.
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을 하자마자 마지막으로 저장(전달)된 이벤트가 전달된다.
behaviorSubject.onCompleted()
// Output
BehaviorSubject 1 completed
BehaviorSubject 2 completed
이벤트의 종류에 상관없이 마지막 이벤트를 저장하기 때문에
behaviorSubject.subscribe {
print("BehaviorSubject 3", $0)
}
// Output
BehaviorSubject 3 completed
Completed 이벤트 또한 전달 후 저장하게 되고, 이후 모든 Observer가 Subscribe할 경우 Completed를 전달하게 된다.
'iOS > RxSwift' 카테고리의 다른 글
[RxSwift] Relay (0) | 2022.09.17 |
---|---|
[RxSwift] Subject - AsyncSubject (0) | 2022.09.17 |
[RxSwift] Subject - ReplaySubject (0) | 2022.09.16 |
[RxSwift] Subject - PublishSubject (0) | 2022.09.14 |
[RxSwift] Observable, Observer, Operators (0) | 2022.09.14 |