[iOS] RxSwift 사용하기(2) - Observable

"Let's use RxSwift - Observable"

Posted by JacksonJang on April 22, 2024

Observable 이란?

Observable은 이벤트를 방출하는 스트림입니다.

구독자(Observer)들이 구독(Subscribe)을 하면 새로운 값이 방출될 때마다 알림을 받아서 이벤트를 처리할 수 있습니다.

Observer 란 이벤트 스트림을 구독하는데 사용합니다. 데이터의 변화를 감지하고 이에 대한 작업을 수행할 수 있습니다.


각 이벤트는 다음과 같이 나뉘게 됩니다.

  • onNext: Observable이나 Subject가 새로운 값을 방출할 때마다 호출합니다.
  • onError: Observable이 에러를 방출하거나, 예외 상황이 발생했을 때 호출합니다.
  • onCompleted: 정상적으로 모든 이벤트를 방출한 후 호출합니다.

예시코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let observable = Observable.of("Hello", "RxSwift")
        
observable.subscribe(
        onNext:{ value in
                print("Next: ", value)
        }, onError: { error in
                print("Error: ", error)
        }, onCompleted: {
                print("Completed")
        }, onDisposed: {
                print("Disposed")
        }
)
.disposed(by: disposeBag)

결과값

1
2
3
4
Next:  Hello
Next:  RxSwift
Completed
Disposed

Cold Observable vs Hot Observable

[간단 요약]

  • Cold Observable : 구독자가 구독을 시작할 때 이벤트가 생성되며, 각 구독자는 독립적으로 이벤트를 받습니다.
  • Hot Observable : 구독자가 구독을 시작하기 전에 이벤트가 발생하며, 이벤트 스트림은 구독자와 상관없이 지속됩니다.

갑자기 웬 뜨겁고 차가운 것을 갖고 오는지 궁금하실 수 있습니다.
RxSwift 공식 문서의 HotAndColdObservables.md를 살펴보면, 자세하게 나와있지만 제가 쉽게 풀어서 설명하겠습니다.

Cold Observable

Cold는 말 그대로 차가운 것이기 때문에 구독을 하지 않으면 절대 방출되지 않는다.
구독자(Observer)가 구독(Subscribe)을 하게 되면 차가웠던 게 녹는 것처럼 방출됩니다.

간단한 예시로 Observable.create, Observable.just, Observable.from 등등을 의미합니다.

Cold Observable 예시 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let observable = Observable<Int>.create { observer in
        observer.onNext(1)
        observer.onNext(2)
        observer.onNext(3)
        observer.onCompleted()
        return Disposables.create()
}

observable.subscribe { event in
        print("Cold Observer 1: \(event)")
}
.disposed(by: disposeBag)

observable.subscribe { event in
        print("Cold Observer 2: \(event)")
}
.disposed(by: disposeBag)

결과값

1
2
3
4
5
6
7
8
Cold Observer 1: next(1)
Cold Observer 1: next(2)
Cold Observer 1: next(3)
Cold Observer 1: completed
Cold Observer 2: next(1)
Cold Observer 2: next(2)
Cold Observer 2: next(3)
Cold Observer 2: completed

Hot Observable

Hot은 말 그대로 뜨거운 것이기 때문에 구독 따위 필요 없이 항상 방출합니다
한마디로 구독자(Observer)의 구독(Subscribe)이 필요 없이 스스로가 알아서 불처럼 방출한다고 생각하시면 됩니다.

만약 구독 전에 onNext를 했더라면, 구독자는 onNext한 것에 대한 이벤트를 받을 수 없습니다.

Hot Observable 예시 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let observable = PublishSubject<Int>()

observable.subscribe { event in
        print("Hot Observer 1: \(event)")
}
.disposed(by: disposeBag)

observable.onNext(1)
observable.onNext(2)

observable.subscribe { event in
        print("Hot Observer 2: \(event)")
}
.disposed(by: disposeBag)

observable.onNext(3)
observable.onCompleted()

결과값

1
2
3
4
5
6
Hot Observer 1: next(1)
Hot Observer 1: next(2)
Hot Observer 1: next(3)
Hot Observer 2: next(3)
Hot Observer 1: completed
Hot Observer 2: completed

github 예시 코드

https://github.com/JacksonJang/RxSwiftExample