PublishSubject

hzw94·2021년 5월 5일
0

RxSwift

목록 보기
3/10

Subject에 대해 이해하기 위해서는 Observable과, Observer에 대해 알면 좋을 것 같다.
각각의 객체들이 하는 액션에 대해 알아야 Subject를 조금더 깊이있게 이해할 수 있을 것이다.

내가 왜 이런 말을 서두에 했는지는 글을 읽어나가면 금방 이해가 갈것이다.
시작부터 Observable과 Observer에 대한 이해로 시작하기 때문이다.

Observable & Observer

우선 두가지에 대해 알아보자.

  • Observable의 역할에 대해 먼저 생각할텐데, Observable은 Observer랑은 다르게 다른 Observable을 구독할수 없다.
  • Observer 역시 다른 Observer로 이벤트를 전달할수 없다.
    따라서 각자의 고유의 역할을 한다 라고 볼수있다.

Subject

하지만 Subject는 조금 다르다.
Subject는 다른 Observer로 이벤트를 받아서 구독자에게 전달을 할수가 있다.
이 반대 역시 가능하다.

따라서 우리는 Subject의 성질에 대해 다음과 같은 결론을 한가지 낼 수 있다.
Subject는 Observable이자 Observe이다.
라는 것이다.

우리가 배우는 RxSwift에는 4가지 Subject를 제공하고있고 차례대로 나열하자면

	1. PublishSubject
    
	2. BehaviorSubject
    
	3. ReplaySubject
    
    	4. AsyncSubject

이제부터 차근차근 하나씩 보도록 하자.

PublishSubject

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" 이벤트에 대해서는 전달을 하지 않는것이다.
다시 도식화하자.

  • onNext함수가 호출이 됌
  • subscribe를 o1 Observer가 신청함
  • 아무런 일이 일어나지 않음

위와 같은 상황이 생기는 이유에 대해 간략하게 써보자면

  • PublishSubject는 구독 이후의 이벤트들에 대해 전달할뿐임
  • 따라서 구독 이전에 작성한 onNext 이벤트에 대해서는 처리하지 않음

으로 정리할수 있다.

profile
볼가놈의 iOS & Swift & RxSwift & PS 저장창고

0개의 댓글