Publish Subject

이숭인·2021년 6월 29일
0

Mastering RxSwift

목록 보기
6/7

Publish Subject란?

subject로 전달되는 이벤트를 Observer(구독자)로 전달하는 가장 기본적인 형태의 subject이다.

publish subject가 생성되고 이벤트를 전달하기까지 대략적인 흐름

  1. subject 생성

  2. subject 구독(subcribe)

    • 처음엔 아무런 event도 존재하지 않기 때문에 생성 직후 subcribe하더라도 아무런 이벤트가 전달되지 않는다.
  3. 이벤트 발생

    • subject는 Observer인 동시에 Observable.
    • 따라서, 다른 소스로부터 이벤트를 전달받아 나 자신(subject)를 구독(subcribe)하는 Observer에게 이벤트를 전달한다.

헷갈리니까 위의 과정을 코드로 작성해서 알아보자 !

let subject = PublishSubject<String>()

subject.onNext("Hello") 
//# 1
let o1 = subject.subscribe{ print(">>v1",$0) }
o1.disposed(by: disposeBag)
// #2

subject.onNext("RxSwift")
// #3

let o2 = subject.subscribe{ print(">> 2",$0) }
o2.disposed(by: disposeBag)
// #4

subject.onNext("Subject")
// #5

//subject.onCompleted()
subject.onError(MyError.error)
// #6

let o3 = subject.subscribe{ print(">> 3",$0) }
o3.disposed(by: disposeBag)
// #7

코드의 흐름을 살펴보자.

  1. 처음 subject 생성 후, 바로 next("Hello") 이벤트를 subject로 전달한다.

  2. #1 까지의 코드에서 아직 subject를 구독하고 있는 Observer가 존재하지 않기 때문에 next("Hello") 이벤트는 사라진다.

  3. #2 에서 subject를 구독하는 Observer(o1)가 생겼지만 구독한 이후 발생된 이벤트가 존재하지 않기 때문에 Observer는 아무런 이벤트도 받지 못한다.

  4. #3 에서 next("RxSwift") 이벤트가 발생되었기 때문에 o1로 이벤트가 전달된다.

  5. #4 에서 새로운 Observser가 구독하게 되고, #5 에서 next("Subject") 이벤트를 전달받는다. 이때, o2는 next("Subject")만을 전달받지만 o1은 next("RxSwift")와 next("Subject")을 전달받는다.

(이유는 생각해보자 바로위에 적어놨다 !)

#6 으로 넘어가기 전에, subject가 Completed(or Error)로 완료된 이후에 새로운 Observer가 생기면 어떻게 될까?? 다시 코드로 돌아가보자.

  1. #6 이 실행된다면 subject를 구독하는 모든 Observer에게 Completed(or Error)이벤트가 전달된다.

  2. #7 에서 이미 완료된 subject를 구독하는 Observer가 생성된다.하지만 이미 완료된 subject이므로 이전의 next이벤트들을 전달받지 못하고 Completed(or Error)이벤트만을 전달받게 된다.

결론은!

  • Publish Subject는 이벤트가 전달되면 즉시 구독하고 있는 Observer(구독자)들에게 전달한다.

  • subject가 최초로 생성되는 시점과 구독(subcribe)가 시작되는 시점 사이에 전달되는 이벤트는 사라진다!

만약 이벤트가 사라지는게 문제가된다면 다음에 공부할 Replay Subject를 사용해보자!

profile
iOS Developer

0개의 댓글