※ 여기서 observer은 세부 정보를 저장, 코드를 한 번만 실행하고 모든 observer에 결과를 제공
PublishSubject
- 빈 상태로 시작, 새로운 값만 subscriber에 방출
- Observable이 오류로 종료되면 PublishSubject 이후 subscriber에 가지 않고 Observable의 오류로 방출
let publishSubject = PublishSubject<String>()
publishSubject.onNext("1. 여러분 안녕하세요")
let 구독자1 = publishSubject
.subscribe(onNext: {
print("첫 번째 구독자 : \($0)")
})
publishSubject.onNext("2. 들리세요?")
publishSubject.on(.next("3. 안들리시나요?")) // 위 문장과 동일한 표현
// 첫 번째 구독자 : 2. 들리세요?
// 첫 번째 구독자 : 3. 안들리시나요?
구독자1.dispose()
let 구독자2 = publishSubject
.subscribe(onNext: {
print("두 번째 구독자 : \($0)")
})
publishSubject.onNext("4. 여보세요")
publishSubject.onCompleted()
publishSubject.onNext("5. 끝났나요?") // 출력 안됨
구독자2.dispose()
publishSubject
.subscribe {
print("세 번째 구독 :", $0.element ?? $0)
}.disposed(by: disposeBag)
publishSubject.onNext("6. 찍힐까요?") // 출력 안됨
// 첫 번째 구독자 : 2. 들리세요?
// 첫 번째 구독자 : 3. 안들리시나요?
// 두 번째 구독자 : 4. 여보세요
// 세 번째 구독 : completed
BehaviorSubject
- 하나의 초깃값을 가진 상태로 시작, 새로운 subscriber에게 초기값 또는 최신값을 방출
- Observable에서 가장 최근에 방출된 항목( 없는 경우 기본값)을 방출하는 것으로 시작하고 나중에 Observable에서 방출한 다른 항목을 계속해서 방출