RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀
PublishSubject는 subject로 전달되는 이벤트를 Observer 전달한다.
즉 이벤트가 전달되면 즉시 구독자에게 전달한다.
PublishSubject의 마블 다이어그램을 표현해봤다.
1. 구독 이후에 Observable이 방출한 이벤트만 Observer에게 전달한다.
마블다이어그램을 보면, 구독 이후에 발생한 이벤트들에 한하여 즉시 전달하는 것을 확인 할 수 있다.
2. Subject 생성 시점과 구독 사이의 전달되는 event는 사라질수 있다.
마블다이어그램에서 o1을 예시로 들면 구독전의 a event는 전달하지 못한 것을 확인 할 수 있다.
이렇게 이벤트가 사라질 수 있는 이슈를 대응하기 위해 ReplaySubject
가 있다. ReplaySubject
는 이벤트를 버퍼크기만큼 저장할 수 있기때문이다. 더 자세한 부분은 ReplaySubject
글에서 정리하겠다.
마블 다이어그램을 코드로 표현해보았다.
전체코드
let ps = PublishSubject<String>()
ps.onNext("a") //아직 구독전이라 아무 일도 안일어남
// 구독
ps.subscribe { print("observer1", $0)}
.disposed(by: disposeBag)
// 출력이 안됨
// 이유 : publishSubject 는 구독이후 전달되는 event만 전달이 됨
// 새로운 이벤트 방출
ps.onNext("b")
ps.onNext("c")
// 또 다른 구독자
ps.subscribe { print("observer2", $0)}
.disposed(by: disposeBag)
ps.onNext("d")
//ps.onCompleted()
//ps.onError(Err.err)
ps.subscribe { print("observer3", $0)}
.disposed(by: disposeBag)
/*
output :
observer1 next(b)
observer1 next(c)
observer1 next(d)
observer2 next(d)
*/
마블다이어그램에서 표현한 결과값과 코드의 결과값이 같다.
이때, onCompleted이나 onError가 방출되면 completed/err을 전달하고 흐름이 종료된다
PublishSubject의 특징을 토대로 언제 사용하면 좋을지 고민해보았다.
이번에 PublishSubject에 대해 정리해보았다.
다음에 BehaviorSubject에 대해 정리해보겠다.