subject로 전달되는 이벤트를 Observer(구독자)로 전달하는 가장 기본적인 형태의 subject이다.
subject 생성
subject 구독(subcribe)
이벤트 발생
헷갈리니까 위의 과정을 코드로 작성해서 알아보자 !
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
코드의 흐름을 살펴보자.
처음 subject 생성 후, 바로 next("Hello") 이벤트를 subject로 전달한다.
#1 까지의 코드에서 아직 subject를 구독하고 있는 Observer가 존재하지 않기 때문에 next("Hello") 이벤트는 사라진다.
#2 에서 subject를 구독하는 Observer(o1)가 생겼지만 구독한 이후 발생된 이벤트가 존재하지 않기 때문에 Observer는 아무런 이벤트도 받지 못한다.
#3 에서 next("RxSwift") 이벤트가 발생되었기 때문에 o1로 이벤트가 전달된다.
#4 에서 새로운 Observser가 구독하게 되고, #5 에서 next("Subject") 이벤트를 전달받는다. 이때, o2는 next("Subject")만을 전달받지만 o1은 next("RxSwift")와 next("Subject")을 전달받는다.
(이유는 생각해보자 바로위에 적어놨다 !)
#6 으로 넘어가기 전에, subject가 Completed(or Error)로 완료된 이후에 새로운 Observer가 생기면 어떻게 될까?? 다시 코드로 돌아가보자.
#6 이 실행된다면 subject를 구독하는 모든 Observer에게 Completed(or Error)이벤트가 전달된다.
#7 에서 이미 완료된 subject를 구독하는 Observer가 생성된다.하지만 이미 완료된 subject이므로 이전의 next이벤트들을 전달받지 못하고 Completed(or Error)이벤트만을 전달받게 된다.
Publish Subject는 이벤트가 전달되면 즉시 구독하고 있는 Observer(구독자)들에게 전달한다.
subject가 최초로 생성되는 시점과 구독(subcribe)가 시작되는 시점 사이에 전달되는 이벤트는 사라진다!
만약 이벤트가 사라지는게 문제가된다면 다음에 공부할 Replay Subject를 사용해보자!