[RxSwift] 4-1. PublishSubject

miori·2022년 2월 10일
0

RxSwiftBasic

목록 보기
7/29
post-thumbnail

RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀


PublishSubject

소개

PublishSubject는 subject로 전달되는 이벤트를 Observer 전달한다.
즉 이벤트가 전달되면 즉시 구독자에게 전달한다.

 마블 다이어그램

PublishSubject의 마블 다이어그램을 표현해봤다.
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에 대해 정리해보겠다.

profile
iS를 공부하는 miori 입니다.

0개의 댓글

관련 채용 정보