when does an Observable begin emitting
Hot Observable은 구독 여부와 무관하게 메모리 리소스를 사용하기 때문에 Hot이라고 표현한다.Cold Observable은 구독 시점부터 메모리 리소스를 사용하며, Lazy의 성격을 가지고 있다.| HOT | COLD | |
|---|---|---|
| 방출 시점 | 생성된 시점 | 구독된 시점 |
| 적합한 사용처 | Variables / properties / constants, tap coordinates, mouse coordinates, UI control values, current time | Async operations, HTTP Connections, TCP connections, streams |
| Subscribe 방식 | Stateful | Stateless |
| ex | PublishSubject, BehaviorSubject | just, single, create |
중복 호출 문제
Hot의 경우 구독한 Observer 만큼 Observable이 create된다. → 중복 호출 문제
let viewDidLoad = Observable.just(()).map { print("이벤트 방출") }
.
.
viewDidLoad
.subscribe(with: self) { owner, _ in
print("구독 1")
}
.disposed(by: disposeBag)
viewDidLoad
.subscribe(with: self) { owner, _ in
print("구독 2")
}
.disposed(by: disposeBag)
출력의 기대값은 아래와 같으나, 실제 출력 값은 이벤트 방출이 2회 발생한다.
이벤트 방출 구독 1 구독 2
즉, 구독한 옵저버의 숫자만큼 옵저버블이 생성된 것이다.
실제 ViewDidLoad는 한번 발생했는데, 2개의 옵저버블이 생성된다
share() 연산자를 통해서 해결 가능. → 하나의 옵저버블에 대해서 여러 옵저버가 공유하겠다는 의미
Hot → Cold로 옵저저블 전환
share() 개념
Cold Observable은 Stateless하기 때문에, 각각의 구독에 대해서 독립적인 시퀀스를 제공한다.
반면, Hot은 Stateful하기 때문에, 하나의 이벤트에 대해서도 구독자 만큼 시퀀스가 방출된다.
