Publish Subject와 유사한 방식으로 동작하고, Subject로 전달된 이벤트를 Observer에 전달하는것은 동일하다.
Subject를 생성하는 방식에서 차이가 존재한다.
아래 코드와 실행 결과를 통해 알아보자 !
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)
//b subject를 생성하면 내부에 next이벤트가 만들어짐 -> 생성자로 전달한 값이 저장됨
// 이 서브젝트를 구독하면 저장되어 있는 이벤트가 구독자한테 바로 전달됨. PublishSubject와의 차이점.
b.onNext(1)
b.subscribe{ print("BehaviorSubject >>2", $0) }
.disposed(by: disposeBag)
//b.onCompleted()
b.onError(MyError.error)
b.subscribe{ print("BehaviorSubject >>3", $0) }
.disposed(by: disposeBag)
이전에 공부했던
PublishSubject같은 경우, 새로 생성되었을때 아무 이벤트가 존재하지 않아서 subcribe를 하더라도 Observer가 아무런 이벤트도 받지 못한 반면,
BehaviorSubject는 처음 생성될 때 하나의 next이벤트를 가지고 있고, 인자로 next이벤트가 가지고 있을 값을 전달받는다.
때문에 subject를 생성하고 subcribe를 통해 Observer가 구독을 시작하는 경우, 생성될 때 가지고 있었던 next이벤트를 전달받는다.
let b = BehaviorSubject<Int>(value: 0)
b.onNext(1)
b.onNext(2)
b.onNext(3)
b.subscribe{ print("BehaviorSubject >>2", $0) }
.disposed(by: disposeBag)
PublishSubject와 거의 유사하지만, 초기 생성될 시점에 하나의 이벤트를 가지고 있는 것이 그 차이다.
subject가 구독되기 전 여러 이벤트를 전달받게 되더라도 구독되는 시점에 Observer에게는 가장 최근에 받았던 이벤트만 전달해준다.