ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RxSwift - 4.Hot Observable, Cold Observable
    RxSwift 2023. 3. 3. 20:58

    Hot Observable, Cold Observable

    • Hot Observable
      • 구독 여부와 관계 없이 요소를 방출하는 Observable
    • Cold Observable
      • 구독이 될 때 요소를 방출하는 Observable

    Hot Observable

    • Hot Observable은 구독 여부와 관계없이 값을 emit할 수 있는 Observable입니다.
    • Hot Observable는 subscribe하고 있는 모든 Observer에게 동시에 같은 값을 emit합니다. 또한 subscribe하기 전에 emit한 값은 받지 못합니다.

    Hot Observable 코드

    let subject = PublishSubject<Int>()
    var number = 1
    var timer: Timer? = nil
    timer = Timer.scheduledTimer(withTimeInterval: 1.0,
                                 repeats: true,
                                 block: { _ in
        if number > 5 {
            timer?.invalidate()
            timer = nil
        } else {
            print("Subject Emitted \(number)")
            subject.onNext(number)
            number += 1
        }
    })
    DispatchQueue.global().async {
        Thread.sleep(forTimeInterval: 1.5)
        subject.subscribe(onNext: { value in
            print("1) \(value)")
        })
    }
    
    DispatchQueue.global().async {
        Thread.sleep(forTimeInterval: 3.5)
        subject.subscribe(onNext: { value in
            print("2) \(value)")
        })
    }
    // 실행 결과
    // Subject Emitted 1
    // Subject Emitted 2
    // 1) 2
    // Subject Emitted 3
    // 1) 3
    // Subject Emitted 4
    // 1) 4
    // 2) 4
    // Subject Emitted 5
    // 1) 5
    // 2) 5

    위 코드는 Timer를 이용해서 1초 간격으로 subject는 number를 emit합니다.(number가 5를 초과하면 종료됩니다.)
    첫번째 Observer는 1.5초 후 subscribe합니다. 첫번째 Observer는 2,3,4,5를 받습니다.
    두번째 Observer는 3.5초 후 subscribe합니다. 두번째 Observer는 4,5를 받습니다.

    위 예시와 같이 Hot Observable은 구독 여부와 상관없이 값을 emit하며, Hot Observable을 subscribe한 Observer는 subscribe한 이후부터의 event를 받습니다. 마치 이전 영상을 볼 수 없는 라이브 스트리밍과 같다고 생각합니다.

    이러한 Hot Observable은

    Cold Observable

    • Cold Observable은 구독이 되는 시점부터 값을 emit하는 Observable입니다.
    • Cold Observable는 subscribe하고 있는 Observer마다 다른 값을 emit합니다.

    Cold Observable 코드

    let observable = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
    
    DispatchQueue.global().async {
        Thread.sleep(forTimeInterval: 1.5)
        let first = observable.subscribe(onNext: { value in
            print("1) \(value)")
        })
        DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
            first.dispose()
        }
    }
    
    DispatchQueue.global().async {
        Thread.sleep(forTimeInterval: 3.5)
        let second = observable.subscribe(onNext: { value in
            print("2) \(value)")
        })
        DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
            second.dispose()
        }
    }
    // 실행 결과
    // 1) 0
    // 1) 1
    // 2) 0
    // 1) 2
    // 2) 1
    // 1) 3
    // 2) 2
    // 1) 4
    // 2) 3
    // 2) 4

    위 코드는 Rx의 interval Operator를 이용해서 1초 간격으로 이벤트를 발생시킵니다.
    첫번째, 두번째 Observer 모두 1초 간격으로 0부터 4까지 독립된 값을 받습니다. (두 Observer는 subscribe한 후 5초 후에 종료됩니다.)

    위 예시와 같이 Cold Observable은 구독이 되는 시점부터 값을 emit하며, Cold Observable은 같은 Observable을 subscribe하여도 자원을 공유하지 않습니다. 마치 특정 동영상을 누구나 재생하면 처음부터 재생이 되며 각각 시청중인 사람마다 현재 시청중인 구간이 다른 것과 같다고 생각합니다.

    Hot Observable, Cold Observable 사용예시

    • Hot Observable
      • 프로퍼티, UI Event, Timer 등이 있습니다.
    • Cold Observable
      • 비동기 작업, Http, Strems 등이 있습니다.

    참조

    https://github.com/ReactiveX/RxSwift/blob/main/Documentation/HotAndColdObservables.md

    https://reactivex.io/documentation/observable.html

    https://www.notion.so/Hot-Cold-Observable-a28377249879411188e229255e39c614

     

    'RxSwift' 카테고리의 다른 글

    RxSwift - 3.Subjects  (0) 2023.03.02
    RxSwift - 2.Observable  (0) 2023.02.28
    RxSwift - 1.Reactive Programming, RxSwift 개념  (0) 2023.02.27
    Functional Programming  (0) 2023.02.24
Designed by Tistory.