[Swift] RxSwift - Subject와 Observable의 차이

호랭이·2022년 5월 26일
0

🍎 RxSwift

목록 보기
5/6

최근 RxSwift를 공부하면서 처음으로 연습 프로젝트에 적용을 해봤다.
프로젝트 내내 알쏭달쏭 했던 의문점!

Subject와 Observable의 차이가 뭐지...?
각각 언제 어떻게 써야 하는 걸까?

일단 Subject에 대해서 빠르게 찾아봤는데, 한줄로 요약하면 아래와 같았다.

Subject는 Observable과 Observer의 역할을 모두 할 수 있다.

...Observable, Observer가 정확히 뭘까?
대충 구독받는 애랑 구독해서 방출하는 요소에 반응하는애 정도로 알고 있는데 🧐
구독은 또 뭐라고 설명할 수 있을까?
정확히 이해하기 위해서 근본부터 자세히 알아보자...







Observer란?

공식문서에서는

ReactiveX에서 observerobservable구독한다.
observerobservable이 방출하는 모든 아이템에 대해 반응한다.

라고 한다.
그렇군...일단 더 알아보자.

subscribe란?

구독구독 말하는데 이 구독은 어떻게 이루어지는 걸까?


먼저, subscribe 구현부를 보면 내부에서 자체적으로 observer를 생성한다.

그리고 asObservable의 구현부(ObservableType의 extension)를 보면 ObservableTypeObservable로 변환해준다.

extension ObservableType {
    
    /// Default implementation of converting `ObservableType` to `Observable`.
    public func asObservable() -> Observable<E> {
        // temporary workaround
        //return Observable.create(subscribe: self.subscribe)
        return Observable.create { o in
            return self.subscribe(o)
        }
    }
}

Observable로 반환만 해주는게 아니라 .subscribe를 통해서 각각의 observer를 생성하고 이 observer에 대한 subscription을 만들어준다.



따라서 아래의 코드는

observable.subscribe(onNext: { (element) in
	print(element)
    })
  1. observable을 subscribe
  2. subscribe 구현부에서 observable 구성요소 각각의 observer가 생성
  3. observer에 대한 subscription 생성. disposable 상태.

이런 과정으로 observer가 observable을 관찰할 수 있게 되는 것이다.

Subject

다시 Subject로 돌아와서...
보통의 Observable처럼 Subject도 subcribe할 수 있는 건 알겠는데, 무슨 차이일까?

Subjectmulticast방식이기 때문에 여러개의 observer를 subscribe 할 수 있다.

반면에 단순 Observable은 unicast 방식이라 한개의 observer만을 subscribe할 수 있다고 한다.




그렇다...
Subject 쓰다가 알수없는 이유로 Observable로 변경해놓고
이상하다고 머리 싸맸던 건 역시 내 잘못이었던 것이다
언제나 그랬듯이 코드는 죄가 없다
죄는 내가 있다...

profile
삐약

0개의 댓글