이번에 들고온 친구는 바로
Hot Observable 과 Cold Observable 입니다.
처음에 이 개념을 만났을 때 정말 와닿지 않았는데 예시로 한 번 이 친구들을 풀어볼까 합니다.
Hot Observable
우선 Hot Observable 의 경우는 우리가 축구를 TV 생방송을 본다고 생각하시면 됩니다.
우리가 TV를 켰을 때, 축구경기가 65분이 지나고 있다고 한다면..
우리는 다시 0분 ~ 65분까지의 축구경기를 볼 수 있을까요? 또, 우리가 앞으로 받게 될 정보는 뭘까요??
첫번째 질문에 대한 답변부터 하자면, NO 입니다. 우리는 이미 지나간 이벤트들에 대해서는 어떠한 정보도 얻을 수 없어요.
축구 경기는 우리가 보건 말건 진행되니까요!!
다만 우리가 TV를 틀게 되면 그 이후의 정보들에 대해 알 수 있는거죠.
이를 Observable에 대입해보면
(축구경기) 우리가 보건말건 진행되는 축구경기 👉 (Hot Observable) 계속해서 이벤트를 방출합니다.
(축구경기) 우리가 축구를 보기 위해 TV를 틀었을 때 받아볼 수 있는 시청각 이벤트 👉 (Hot Observable) 구독하여 이벤트를 전달 받습니다.
다시 한 번, 정리해보면 Hot Observable은 기본적으로 계속 이벤트가 발생하지만 구독 이후의 시퀀스에 대해서만 값으로 받아오는 친구다~ 라고 할 수 있을 것 같아요.
또한 TV 생중계의 경우, 여러 사람들이 모여서 볼 수 있듯이 Hot Observable역시 여러 구독자가 공유해서 사용할 수 있습니다.
이것을 보고 multicast의 특성을 가질 수도 있겠구나 라는 것을 알 수 있어요.
다만.. 구독자가 한 명일 수도 있으니 무조건 multicast = Hot Observable 인 건 아니겠죠?
Cold Observable
반면의 Cold Observable의 경우, VOD를 생각하시면 됩니다.
OTT 서비스 구독 후, 우리가 따로 컨텐츠를 틀어주는 것이 아니면 이벤트가 발생하지 않죠??
드라마라고 가정했을 때, 우리가 컨텐츠를 클릭하면 1화부터 16화까지의 모든 이벤트를 다 볼 수 있게되는데..
구독 이후 모든 시퀀스에 대한 값을 받아오는..!!
이게 바로 Cold Observable의 특징입니다.
그리고 이친구는 unicast의 특성을 갖는데, 이 부분은 일상적인 예시보다 코드를 보면 확 와닿더라구요
우선 랜덤으로 0~50까지의 수를 방출하는 Observable를 만들어주고
let random = Observable.create { number in
number.onNext(Int.random(in: 0...50))
return Disposables.create()
}
random
.subscribe(with: self) { owner, number in
print("첫번째 : \(number)")
}
.disposed(by: disposeBag)
random
.subscribe(with: self) { owner, number in
print("두번째 : \(number)")
}
.disposed(by: disposeBag)
random
.subscribe(with: self) { owner, number in
print("세번째 : \(number)")
}
.disposed(by: disposeBag)
random
.subscribe(with: self) { owner, number in
print("네번째 : \(number)")
}
.disposed(by: disposeBag)
각각 다른 네 개의 구독자를 만들어 주어 구독하게 되면
위와 같이 서로 다른 값이 나오게 되는데,
이처럼 Cold Observable은 하나에 이벤트에 대해 구독자들이 그 이벤트를 공유하지 않고 각 구독마다 이벤트 스트림이 생기는 unicast의 특성을 갖고 있음을 알 수 있습니다.
이번엔 코드보단 저만의 언어로 좀 풀어서 설명해보는 방식으로 이야기를 풀어봤습니다.
아마 위와 관련된 코드는 앞으로의 글에서 자주 보시지 않을까 하는... 생각을 끄적여보며..
.
.
.
.
그럼 이만~
'Swift' 카테고리의 다른 글
[iOS] About ObservedResults, ObservedRealmObject (1) | 2024.09.16 |
---|---|
[iOS] About state, binding (0) | 2024.09.08 |
[iOS] About Calendar (0) | 2024.08.28 |
[iOS] About GCD (Grand Central Dispatch) (2) | 2024.08.24 |
[iOS] About Pagination (0) | 2024.08.21 |