알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다... 알아야한다...
알아야하니깐 쓴다. 알아야한다.
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 |
댓글