본문 바로가기

Swift/RxSwift

[🔥Rx뿌셔] Observable

728x90

Rx의 핵심 개념은 유튜버와 구독자의 관계를 생각하면 된다.

구독자들이 어떠한 Observable이라는 유튜버를 구독하고 유튜버가 영상을 올리면, 즉 이벤트를 방출하면 이를 감지해서 지금 시청하거나 보관함에 넣거나 등의 액션을 취하는 것이다. 

 

Observable이란?

사전적인 의미는 관찰 가능한 이라는 의미를 갖고 있다.

 

Observable이 이벤트를 방출하고 구독자가 이 이벤트를 관찰할 수 있다.는 것에서 그 의미를 찾을 수 있다. 

(시간의 흐름에 따라서 이벤트를 관찰할 수 있다.)

 

 

Event Type

Observable이 방출하는 이벤트에는 크게 네 가지 타입이 존재한다.

이 네가지 타입에 대해 Observable을 구독한 구독자는 이벤트를 전달받고 각 상황에 따라서 액션을 취하게 된다.

  • onNext
  • onError
  • onCompleted
  • onDisposed 

 

onNext

Observable이 새로운 이벤트를 방출할 때 onNext 메소드가 호출된다.

 

 

onError

Observable이 기대한 결과가 아니거나 오류가 발생한 경우 onError 메소드가 호출된다.

 

 

onCompleted

Observable 시퀀스에서 에러가 발생하지 않고 더 이상 방출할 이벤트가 없을 때, 즉 완료되었을 때 onCompleted 메소드가 호출된다.

 

 

onDisposed

Observable 시퀀스가 말 그대로 버려진 경우, onDisposed 이벤트가 호출된다. 

 

 


사용 방법

Observable이 시간이 지나면서 각 상황에 맞는 이벤트를 방출하고 구독자들이 Observable을 구독하여 이벤트에 다른 액션을 취한다. 

 

이를 코드로 어떻게 구현되는지 살펴보자.

아래와 같이 시간이 지남에 따라서 1 -> 2 -> 3 -> 순으로 이벤트를 방출하는 Observable이 있다고 할 때

이 이벤트에 대해서 어떻게 처리할 수 있을까? 처리할까?

먼저, 이 이벤트에 대한 감지를 위해서는 구독을 해야한다.

let observable = Observable.of(1, 2, 3, 4)
observable.subscribe()

위와 같이 .subscribe() 메서드를 통해 구독을 할 수 있다.

 

 

이렇게만 하고 아무런 작업을 하지 않는다면 유튜버가 영상을 올려도 이에 대한 아무런 반응을 하지 않는 것과 같다;;

Observable이 방출한 이벤트에 대해서 앞서 말한 네가지 타입으로 나눠서 상황에 대한 액션을 취할 수 있다.

observable.subscribe { element in
    print("Observable로 부터 \(element) 를 전달 받았습니다.")
} onError: { error in
    print(error.localizedDescription)
} onCompleted: {
    print("Observable 이 정상적으로 종료 되었습니다.")
} onDisposed: {
    print("Observable 이 버려졌습니다.")
}

그리고 실행을 하면 아래와 같이 출력되는 것을 확인할 수 있다.

 

 

시간 순서대로, 에러가 나지 않았기 때문에 순차적으로 출력된다.

그리고 문제 없이 작업이 끝났으므로 onCompleted 메서드가 실행되고, 하나의 observable에 대한 Life Cycle 끝나므로 onDisposed도 호출되는 것을 확인할 수 있다.

 

 

🔥 정리
Observable은 시간의 흐름에 따라서 이벤트를 방출하고 
이 이벤트를 다룰 곳에서 구독을 하여 이벤트(의 타입)에 따라서 액션을 취할 수 있다.

'Swift > RxSwift' 카테고리의 다른 글

[🔥Rx뿌셔] Disposable  (0) 2022.10.25
[🔥Rx뿌셔] Subscribe  (0) 2022.10.25
[🔥Rx뿌셔] Intro  (1) 2022.10.24
[🌱SeSAC] Creating and Subscribing to Observables  (0) 2022.10.24
[🌱SeSAC] Rx.playground 실행하는 방법  (1) 2022.10.24