우선 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인ObservableConvertibleType
에asObservable
메소드가 선언되어 있으며,ObservableType
처럼 default implementations로 선언된 메소드가 존재하지만asSingle
,asDriver
,asSharedSequence
3가지 유형의 확장 메소드만 존재합니다.
3. Observable
- 가장 중요한
Observable
입니다. class이며 선언부에는ObservableType
protocol을 준수하고 있습니다. 따라서ObservableType
의 부모 protocol인ObservableConvertibleType
protocol도 준수한다고 볼 수 있습니다. 그래서subscribe
와asObservable
이 선언되어 있습니다. Observable
의 subscribe에는rxAbstractMethod
가 호출되고 있으며rxAbstractMethod
는 결과적으로fatalError
을 호출하여 Runtime error을 발생시킵니다. 즉Observable
은 추상클래스라고 볼 수 있습니다.- 다행히도
Observable
에는 extension 메소드가 2개밖에 존재하지 않고 이 메소드 또한 deprecated 되었습니다.
그러면 이제 Observable을 생성해보겠습니다.
Observable Just
가장 간단한 Just
로 Observable
이 만들어지는 과정을 살펴보겠습니다.
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
ObservableType
의subscribe<O: ObserverType>(_ observer: O) -> Disposable
이외에도 몇가지 다른 subscribe가 존재합니다.ObservableType+Extensions.swift
에는ObservableType
의 extension 메소드 두개의subscribe
가 선언되어 있습니다.- 첫 번째
subscribe
는Event
를 인자로 받는 closure가 parameter이며Disposable
를 반환합니다. - 두 번째
subscribe
는Element
를 인자로 받는 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
이벤트를 계속해서 방출할 수 있습니다.Observable
은error
이벤트를 방출하여 완전 종료될 수 있습니다.Observable
은completed
이벤트를 방출하여 완전 종료될 수 있습니다.- 여기서 종료된다는 의미는 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가 존재합니다.