BehaviorSubject는 PublishSubject와 유사한 방식으로 동작한다.
서브젝트로 전달된 이벤트를 구독자로 전달하는것은 동일하다.
하지만 서브젝트를 생성하는 방식에 차이가 있다.
let p = PublishSubject<Int>()
//PublishSubject는 빈 생성자를 사용
let b = BehaviorSubject<Int>(value: 0)
//BehaviorSubject는 하나의 값을 전달한다.
또다른 차이는 서브젝트를 구독할 때 차이가 있다.
let p = PublishSubject<Int>()
p.subscribe{ print("PublishSubject >>", $0)}
.disposed(by: disposeBag)
---------------------------------------
let b = BehaviorSubject<Int>(value: 0)
b.subscribe{print("BehaviorSubject >>", $0)}
.disposed(by: disposeBag)
//BehaviorSubject >> next(0)
BehaviorSubject로 NextEvent가 전달되었다.
여기엔 0이 저장되어있다.
이 0은 BehaviorSubject를 생성할 때 생성자로 전달된 것이다.
BehaviorSubject를 생성하며 내부에 NextEvent가 하나 생성된다.
그리고 여기에는 생성자로 전달한 값이 전달된다.
새로운 서브젝트를 하나 생성하면 전달된 NextEvent가 바로 전달된다.
여기서 옵저버를 하나 추가한다면?
let b = BehaviorSubject<Int>(value: 0)
b.subscribe{print("BehaviorSubject >>", $0)}
.disposed(by: disposeBag)
b.onNext(1)
b.subscribe{print("BehaviorSubject2 >>", $0)}
//BehaviorSubject >> next(0)
//BehaviorSubject >> next(1)
//BehaviorSubject2 >> next(1)
BehaviorSubject는 생성자로 추가된 NextEvent를 저장하고 있다가 새로운 옵저버에 전달된다
그 후 서브젝트로 새로운 NextEvent가 전달되면 기존에 저장되어있던 이벤트를 교체한다.
결과적으로 가장 최근 NextEvent를 옵저버로 전달한다.