RxSwift Observable

강동희
cashwalk
Published in
9 min readJan 25, 2019

이번 스토리에서는 RxSwift에서 사용하는 Observable에 대해서 알아보려고 합니다.

우선 ReactiveX에서 Observable의 개념에 대해서 간략히 알아보겠습니다.

Observable

Observable은 아이템을 소유하고 있고, 일정 기간 동안 계속해서 이벤트를 생성합니다. 이러한 과정을 보통 emitting(방출)이라고 표현합니다.

Observable이 이벤트를 방출하는 상태를 Sequence 또는 Observable Sequence라 부릅니다. 이벤트 방출은 모두 비동기적입니다.

즉, Observable은 특정 타입의 아이템을 비동기적으로 방출한다고 볼 수 있습니다.

이러한 개념들을 가장 잘 이해할 수 있는 방법은 Marble Diagram입니다.

Marble Diagram

Marble Diagram은 시간의 흐름에 따라서 값을 표시하는 방식입니다.

  • 상기 이미지의 검은색 가로줄을 하나의 Observable이라고 볼 수 있습니다. 시간은 왼쪽에서 오른쪽으로 흐른다고 가정하고 있습니다.
  • 첫 번째 Observable은 20, 40, 60, 80, 100, 두 번째 Observable은 1, 1을 순서대로 방출하고 있습니다.
  • 세 번째 Observable은 첫 번째와 두 번째 Observable을 합쳐진 Observable로서 시간 순서에 따라서 20, 40, 60, 1, 80, 100, 1을 방출하고 있습니다.

상기 이미지와 같은 다이어그램을 RxMarbles에서 테스트를 해볼 수 있습니다.

Observable의 개념적인 설명은 이정도로 마치고 RxSwift에서 구현되어 있는 Observable에 대해서 알아보겠습니다.

Observable in RxSwift

참조 : https://www.polidea.com/blog/8-Mistakes-to-Avoid-while-Using-RxSwiftPart-1/

  • 상기 이미지는 RxSwift에서 구현된 Observable의 다이어그램입니다.
  • 다이어그램은 ObservableType , SubjectType , ConnectableObservableType 과 나머지 class, struct로 이루어져 있습니다.

해당 스토리는 RxSwift 코드 위주로 설명을 하고 있습니다. 이해의 편의를 위해서 앞으로 설명할 RxSwift 코드의 주석코드와 DEBUG 코드는 제거했음을 알려드립니다.

1. ObservableType

  • 가장 최상위에 위치한 ObservableType입니다. protocol 선언부에는 subscribe 메소드만 선언되어 있지만, RxSwift에서는 ObservableType의 default implementations로 선언된 많은 메소드들이 존재합니다.
  • 하지만 대부분 메소드는 상기 다이어그램에 나타나 있는 다형성을 이용하여 Observable을 반환하는 메소드로 이루어져 있는데 천천히 설명하도록 하겠습니다.

2. ObservableConvertibleType

  • ObservableType의 부모 protocol인 ObservableConvertibleTypeasObservable 메소드가 선언되어 있으며, ObservableType처럼 default implementations로 선언된 메소드가 존재하지만 asSingle , asDriver , asSharedSequence 3가지 유형의 확장 메소드만 존재합니다.

3. Observable

  • 가장 중요한 Observable 입니다. class이며 선언부에는 ObservableType protocol을 준수하고 있습니다. 따라서 ObservableType 의 부모 protocol인 ObservableConvertibleType protocol도 준수한다고 볼 수 있습니다. 그래서 subscribeasObservable 이 선언되어 있습니다.
  • Observable 의 subscribe에는 rxAbstractMethod 가 호출되고 있으며 rxAbstractMethod 는 결과적으로 fatalError 을 호출하여 Runtime error을 발생시킵니다. 즉 Observable 은 추상클래스라고 볼 수 있습니다.
  • 다행히도 Observable 에는 extension 메소드가 2개밖에 존재하지 않고 이 메소드 또한 deprecated 되었습니다.

그러면 이제 Observable을 생성해보겠습니다.

Observable Just

가장 간단한 JustObservable이 만들어지는 과정을 살펴보겠습니다.

Just 는 하나의 Element 를 소유하고 하는 Observable 입니다.

  • Marble Diagram은 하나의 아이템만 방출하고 종료되는 것을 볼 수 있습니다.

1. Just

  • 상기코드는 RxSwift Just.swift 의 일부분입니다.
  • ObservableType 의 클래스 메소드인 just(:)Just 인스턴스를 반환합니다.
  • Just 는 하나의 Element를 가지고 있고 Producer 의 자식 클래스입니다.
  • 상기 다이어그램에서 언급되있던 Producer 가 등장했습니다.
  • Producer 는 무엇일까요?

2. Producer

  • 상기 코드는 Producer.swift 의 일부분입니다. 추상클래스인 Observable 을 상속받고 있으며, Observable 의 추상 메소드인 subscribe(:) 가 구현되어 있지만 새로운 추상 메소드인 run(:cancel:) 이 선언되어있습니다. 즉 Producer 도 추상 클래스라고 볼 수 있습니다.
  • 다시 Just선언부를 보게되면 Producer 을 상속받아서 subscribe 를 오버라이딩하였고, run 은 여전히 추상 메소드로 존재합니다.

3. Just Instance

  • Just 인스턴스를 만들어 보도록 하겠습니다. 즉 Observable 을 만들어보겠습니다.
  • 각각 String , Int , Double , Bool Type의 Element가 저장된 Just 인스턴스가 생성되었습니다.
  • Swift Generic을 통해서 Data Type이 정해집니다.
  • 생성하는 코드는 Observable 을 통해서 ObservableType 의 extension 메소드에 접근하였습니다.
  • ObservableType 을 통하여 just에 접근하면 ObservableType 은 protocol이므로 컴파일 에러가 발생합니다.

Observable Subscribe

  • ObservableTypesubscribe<O: ObserverType>(_ observer: O) -> Disposable 이외에도 몇가지 다른 subscribe가 존재합니다.
  • ObservableType+Extensions.swift 에는 ObservableType 의 extension 메소드 두개의 subscribe 가 선언되어 있습니다.
  • 첫 번째 subscribeEvent 를 인자로 받는 closure가 parameter이며 Disposable 를 반환합니다.
  • 두 번째 subscribeElement 를 인자로 받는 closure, Swift.Error 를 인자로 받는 closure, 인자가 없는 closure 2개가 parameter이며 Disposable 를 반환합니다.
  • 상기 2개의 메소드를 이용하여 Observable를 관찰해보겠습니다.
  • Just 인스턴스를 생성하여 subscribe 를 호출하여 Event 인자를 출력해보면 next(1)completed 가 차례대로 출력됩니다.
  • Event 는 무엇일까요?
  • 같은 Just 인스턴스로 두번째 subscribe 를 호출하게 되면, 선언된 순서대로 로그가 출력됩니다.
  • next , completed , error , disposed 전부 어떤 의미일까요?

Event

  • Observable은 어떤 구성요소를 가지는 next 이벤트를 계속해서 방출할 수 있습니다.
  • Observableerror 이벤트를 방출하여 완전 종료될 수 있습니다.
  • Observablecompleted 이벤트를 방출하여 완전 종료될 수 있습니다.
  • 여기서 종료된다는 의미는 Observable Sequence가 끝나는 걸 의미합니다.
  • RxSwift에서 이러한 이벤트들은 enum 으로 정의되어 있습니다.
  • next 이벤트는 어떠한 Element 인스턴스를 가지고 있습니다.
  • error 이벤트는 Swift.Error 인스턴스를 가집니다.
  • completed 이벤트는 아무런 인스턴스를 가지지 않고 단순히 이벤트를 종료시킵니다.

즉 next에서 completed 또는 error로 진행되면서 Observable이 종료되는 건. Observable Life Cycle입니다.

  • Event 에는 상기 코드와 같은 Property가 존재합니다.
  • element 를 출력해보면 Just 에 선언된 String “1”이 출력됩니다.
  • completed 이벤트가 발생하면 isCompleted 가 true가 되고 element 는 nil값이 내려옵니다.

위와 같은 방식으로 RxSwift에는 Just 이외에도 여러개의 Observable 의 subclass가 존재합니다.

--

--