우리는 이전 아티클을 통해서 subject의 observable, observer의 역할을 어떻게 수행하는지를 공부했습니다. 이제는 그럼 subject는 어떤게 있는지, 어떻게 사용할 수 있는지를 알아봅시다!
구독 이후에 방출된 항목들만 옵저버에게 전달
우리가 지금까지 배워온 subject 내용 그대로입니다.
예시 코드로 살펴보자면
let zoocMember = PublishSubject<String>
zoocMember.subscribe(onNext: {
print("zooc 구성원: \\($0)")
}).disposed(by:disposeBag)
zoocMember.onNext("류희재")
zoocMember.onNext("김효재")
zoocMember.subscribe(onNext: {
print("new zooc 구성원: \\($0)")
}).disposed(by: disposeBag)
zoocMember.onNext("손애진")
/*
zooc 구성원: 류희재
zooc 구성원: 김효재
zooc 구성원: 손애진
new zooc 구성원: 손애진
*/
Observable이 가장 최근에 발행한 항목을 한번 방출하며, 그 이후부터 Observable에 의해 방출된 항목들을 Observer에게 전달한다.
정의가 좀 어려운데 정리하자면 “가장 최근에 방출한 값”을 가지고 있음
A. 그런 상황을 대비해서 “초기값”을 가짐, 그래서 초기값을 같이 정의해야함
아래 코드처럼 말이죠~
let zoocMember = BehaviorSubject<String>(value: "류희재")
zoocMember.subscribe(onNext: {
print("zooc 구성원: \\($0)"
}).disposed(by: disposeBag)
// zooc 구성원: 류희재
이런 식으로 코드를 짜면 아무런 이벤트가 없기 때문에 “류희재” 라는 초기값이 바로 방출됨
<aside> 🎀 publish → 내가 구독 전에 이미 방출된 이벤트는? 필요없음 behavior → 구독 전에 가장 최근에 방출된 값 ‘한개라도!’ + 없으면 초기값이라도!
</aside>
최신 이벤트를 버퍼 사이즈에 맞게 저장하고, observer가 구독할 시 버퍼에 있는 이벤트를 모두 전달