Subject에 대해 이해하기 위해서는 Observable과, Observer에 대해 알면 좋을 것 같다.
각각의 객체들이 하는 액션에 대해 알아야 Subject를 조금더 깊이있게 이해할 수 있을 것이다.
내가 왜 이런 말을 서두에 했는지는 글을 읽어나가면 금방 이해가 갈것이다.
시작부터 Observable과 Observer에 대한 이해로 시작하기 때문이다.
우선 두가지에 대해 알아보자.
하지만 Subject는 조금 다르다.
Subject는 다른 Observer로 이벤트를 받아서 구독자에게 전달을 할수가 있다.
이 반대 역시 가능하다.
따라서 우리는 Subject의 성질에 대해 다음과 같은 결론을 한가지 낼 수 있다.
Subject는 Observable이자 Observe이다.
라는 것이다.
우리가 배우는 RxSwift에는 4가지 Subject를 제공하고있고 차례대로 나열하자면
1. PublishSubject
2. BehaviorSubject
3. ReplaySubject
4. AsyncSubject
이제부터 차근차근 하나씩 보도록 하자.
PublishSubject는 Subjec로 전달 되는 이벤트를 Observer에게 전달하는 가장 기본적인 형태의 Subject이다.
먼저 가장 간단한 특징 하나만 알고가자.
항상 설명보다는 직접 해보는게 빠르다.
코드로 보자.
// 우선 안전하게 처리 할 수 있게, disposeBag을 사용하고
let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
위의 코드를 보면 Type Parameter가 String 임을 확인할수 있다.
하지만 딱히 뭔가 값이나 내용물이 있어 보이진 않는다.
그냥 일반적은 Swift코드에서 보면
var dict : [String: String] = [String:String]()
과 비슷한 상태라고 생각이드는데, 실제로 아무것도 없다.
처음에 서브젝트는 비어있는 상태로 생성이 된다. 다시 말하면 서브젝트가 생성되는 시점에는 아무런 이벤트가 저장되있지 않다.
Subject는 계속 말했듯 Observable인 동시에 Observer이다.
다른 소스로 이벤트를 받는것, 그리고 전달하는 것 역시 가능하다.
Subject역시 Observer이기 때문에 .onNext 메소드(연산자)사용이 가능하다.
코드로 한번보자.
subject.onNext("Hello")
여기까지 쳤을 때, subject로 이벤트가 전달이 된다.
하지만 이 상태에서는 구독(subscribe)하는 객체가 존재하지 않아서 그냥 사라질뿐이다.
다른 Observer가 Subject를 구독하는게 가능하니 한번 추가 해보자.
let o1 = subject.subscribe{
print(">> 1", $0)
}
o1.disposed(by: disposeBag)
여기까지 작성을했다 하더라도 콘솔에는 아무것도 출력되지 않는다.
PublishSubject는 구독 이후에 생기는 이벤트만을 구독자에게 전달한다.
그렇기 때문에 구독 하기 전에 작성한 "Hello" 이벤트에 대해서는 전달을 하지 않는것이다.
다시 도식화하자.
위와 같은 상황이 생기는 이유에 대해 간략하게 써보자면
으로 정리할수 있다.