본문 바로가기
iOS/RxSwift

[RxSwift] Hot vs Cold Observable

by Jiseong 2022. 6. 8.

알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 

 

알아야하니깐 쓴다. 알아야한다.

Cold Observable

기본적으로 Observable은 lazy하다.

 

lazy하다는 말은 뭐시냐? Observable을 정의만 해놓는다고, 뭐가 이뤄지진 않는다는 것이다.

 

subscribe를 해야 이벤트를 방출하므로 처음으로 발생한 이벤트부터 전체 시퀀스를 확인할 수 있다.

 

코드로 예를 들어보자

let coldObservable = Observable<Int>.create { emit in
    emit.onNext(Int.random(in: 0...5))
    return Disposables.create()
}


coldObservable
	.subscribe(onNext: {
    	print($0)
    })
    .disposed(by: disposeBag)
// 2
    
coldObservable
	.subscribe(onNext: {
    	print($0)
    })
    .disposed(by: disposeBag)
    
// 4

Cold Observable은 Hot Observable과는 다르게 구독하는 즉시 이벤트가 방출되기 때문에 각 구독마다 Stream이 다르고, 값이 공유되지 않아 다르게 출력된다. 

 

이와 같은 방식을 Unicast라고 한다.

 

만일 같은 값을 방출하고 싶다면..

let 난수 = Int.random(in: 0...5)

let coldObservable = Observable<Int>.create { emit in
    emit.onNext(난수)
    return Disposables.create()
}


coldObservable
	.subscribe(onNext: {
    	print($0)
    })
    .disposed(by: disposeBag)
// 2
    
coldObservable
	.subscribe(onNext: {
    	print($0)
    })
    .disposed(by: disposeBag)
    
// 2

데이터를 생성하는 Int.random()을 Observable 외부로 옮겨 외부에서 생산하도록 하면 된다.

Hot Observable

얘는 Observable 생성과 동시에 이벤트를 방출한다.

그리고 위 그림의 subject와 같이 subscribe가 진행되면 subscribe 이후에 발생한 이벤트를 방출한다.

 

이전에 방출했던 데이터에 대해서는 현재 구독을 시작한 Observer들은 받아볼 수 없다.

 

아 물론 버퍼가 있는 ReplaySubject나 기본값을 가지는 BehaviorSubject는 좀 다르다.

BehaviorSubject는 1개의 이전 이벤트를 가져오고 ReplaySubject는 설정한 버퍼사이즈인 N만큼의 이벤트를 가져온다.

 

많이들 예를 드는 것은.. Cold는 VOD로 예로 들고, Hot은 Live Streaming을 예로 든다.

 

Cold는 처음부터 발생한 이벤트를 볼 수 있고, Hot은 시청(구독) 이후부터 발생한 이벤트를 볼 수 있으니 정말 적절한 예시같다.

 

'iOS > RxSwift' 카테고리의 다른 글

[RxSwift] flatMapLatest (feat. flatMap)  (1) 2022.08.09
[RxSwift] map vs flatMap  (0) 2022.08.09
[RxSwift] RxDataSources 사용해보기  (0) 2022.08.02
[RxSwift] concat  (3) 2022.07.26
[RxSwift] Observable, Dispose  (0) 2022.03.20

댓글