RxSwift - Observable vs Subject 차이점

Jenny·2022년 4월 9일
1
post-thumbnail

Observable or Subject의 차이점

Subject

  • Subject는 Observable나 Observer처럼 행동 하수 있는 객체 입니다.
  • Subject는 SubjectType을 준수 하는 객체이며, 한편 으로 ObservableType 역시 준수 하고 있습니다. 그렇기에 Observable나 Observer 처럼 행동이 가능 합니다.
//SubjectType에서 ObservableType을 채택
public protocol SubjectType : ObservableType {
    
    associatedtype Observer: ObserverType

    /// Returns observer interface for subject.
    ///
    /// - returns: Observer interface for subject.
    func asObserver() -> Observer
}
  • Observable과 Subject와 차이점이 있다면 Observable은 Unicast 방식 이지만, Subject는 Multicast 방식 이라는 차이점을 가지고 있습니다.

UniCast or MultiCast

  • 앞서 Observable는 UniCast 방식이라 설명 드렸으며, Unicast 방식은 (1:1) 연결방식을 뜻합니다. observer 하나만을 Subscribe(구독)할 수 있습니다.
  • 그럼 UniCast 방식은 observer 하나만 구독이 가능하기에 매번 Observable를 생성 해야 하나요?? 그건 아닙니다!!
let randomWithIntObservable: Observable<Int> = Observable<Int>.create { observer in
    observer.onNext(Int.random(in: 1...100))
    
    return Disposables.create()
}

randomWithIntObservable.subscribe { event in
    print("randomWithInt :(1) \(event)")
}


randomWithIntObservable.subscribe { event in
    print("randomWithInt :(2) \(event)")
}

Int Type의 Observable을 생성하여 observer가 1 부터 100까지의 숫자의 이벤트를 처리하도록 코드를 구현 하였습니다. 이렇게 구독을 통해 이벤트를 방출 시켜 동일한 값이 나오는지 확인을 해보았지만 결과는!!

서로 다른 값의 Event를 방출(Emit)하는 것을 확인 할 수 있었습니다. 이유는 Observable는 Unicast 방식 이기때문 입니다!! Unicast 방식은 (1:1)연결 방식으로 한 가지의 observer만 subscribe(구독) 관찰 할 수 있습니다. 그렇기에 첫번째 observer가 끝난후 Disposeable이 Return 되고 두 번째 subscribe(구독)이 호출 되는 형식으로 됩니다.

  • 반면 Subject 같은 경우 MultiCast 방식 이기에 (1:N)으로 구독을 할수 있습니다, 그렇기에 Unicast와 반대로 하나의 Observer가 여러 Subscriber에게 공유를 할수 있습니다.
  • 또한 Subject는 Observable 이며 Observer이기에 onNext(이벤트 방출) 뿐만 아니라, Subscribe(구독) 역활을을 할수 있습니다.
let randomWithSubject: PublishSubject<Int> = PublishSubject<Int>()


randomWithSubject.subscribe { event in
    print("randomWithIntSubject :(1) \(event)")
}

randomWithSubject.subscribe { event in
    print("radomWithIntSubject :(2) \(event)")
}

randomWithSubject.onNext(Int.random(in: 1...100))
  • Observable와 다르게 Subject가 onNext(이벤트 방출) 뿐만 아니라 Subscribe(구독) 역활을 하시는 것을 볼 수 있습니다. 또한 Observable와 다르기 MultiCast 방식 이기에 결과 값 역시 차이점 이 있습니다.

  • Subscribe(구독)을 통해 방출한 이벤트 결과 값이 동일한 것을 확인 하실수 있습니다. 이유는 앞서 강조 하였던 MultiCast 방식이기 때문 입니다. Subject는 여러 observer를 Subscribe(구독), 관찰 할수 있으며, 쉽게 말해 공유 할수 있습니다. 그렇기에 첫번 째 구독한 이벤트를 두번째 구독한 이벤트에게 넘겨 준 것입니다!!

profile
"Jenny 있게 iOS 개발을 하며 성장해 나아가자"

0개의 댓글