RxSwift - Observable vs Subject 차이점
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(구독), 관찰 할수 있으며, 쉽게 말해 공유 할수 있습니다. 그렇기에 첫번 째 구독한 이벤트를 두번째 구독한 이벤트에게 넘겨 준 것입니다!!
Author And Source
이 문제에 관하여(RxSwift - Observable vs Subject 차이점), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dohyun8032/RxSwift-Observable-vs-Subject-차이점저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)