이번에는 각각의 Subject들을 조금더 깊게 알아보자!
Subject의 문서를 살펴보면 위처럼 Observable을 상속하고 있으며, ObserverType을 채택 하고 있는 것이 보인다 이로써, Subject는 Observable의 역할과 Observer역할을 둘 다 수행하는 것을 알 수 있습니다.
그럼 Cancelable은? Cancaelabel은 protocol로 구현이 되어있는데 구독이 취소되어있는지 확인한다.
참고 dispose의 사전적의미는 처리하다, 없애다라는 뜻이다.
그리고 다양한 변수 들이 존재하는데 한 번 살펴 보겠슴다.
hasObservers는 현재 구독자가 있는지 확인합니다.
disposed: 이 주제(subject)가 폐기되었는지 여부를 나타냅니다.
observers: 현재 구독된 모든 관찰자를 저장하는 컬렉션입니다.
stoppedEvent: 주제가 완료되거나 에러가 발생한 이벤트를 저장합니다.
전체적인 흐름을 한번 보면
구독: subscribe 메서드가 호출되면, 새로운 관찰자가 observers 리스트에 추가됩니다. 이 관찰자는 PublishSubject가 이벤트를 발행할 때 그 이벤트를 받게 됩니다.
이벤트 발행: on(_ event:) 메서드를 통해 이벤트가 발행되면, 모든 구독자에게 그 이벤트가 전달됩니다.
구독 취소: dispose 메서드가 호출되면, PublishSubject는 더 이상 이벤트를 발행하지 않으며, 모든 구독자가 제거됩니다.
BehaviorSubject는 PublishSubject와 달리 초기값을 갖기 때문에
위의 사진처럼 정의되어 있는 것을 확인 할 수 있습니다.
위의 사진을 살펴보면 프로퍼티 옵저버로 isStopped를 계속살펴보다가 nil이면 멈추게 되는데 nil이 되는경우는 아래의 사진 처럼 구현이 되어있다.
또한 변수의 이름처럼 lastElement에서 알 수 있듯이 마지막값(최신의 값)을 저장하고 방출을 한다
역시 ReplaySubject에서 눈에 띄는 부분은 bufferSize인데 bufferSize에 따라서 최근에 전달된 값들이 방출되기 때문에 AsyncSubject와 비슷한 부분이 있다..!