RxSwift Observable Subclass Part3

강동희
5 min readFeb 9, 2019

--

Observable Subclass 마지막 시리즈입니다.

이번 스토리에서는 Deferred , Error , Do 에 대해서 알아보겠습니다.

Deferred

  • Deferred.swift에는 ObservableType extension 메소드와 2개의 클래스 Deferred, DeferredSink가 선언되어 있습니다.

1. deferred(:)

  • deferred(:)() -> Observable<E> 타입의 Throwing Closure을 파라미터로 받고 Deferred를 생성하여 반환합니다.

2. Deferred

  • DeferredProducer의 자식 클래스이 () -> S 타입의 Throwing Closure를 소유하고 있습니다.
  • run(:cancel:)에서는 DeferredSink을 생성하여 run()을 호출한 뒤 DeferredSink 인스턴스와 run()의 반환값을 포함한 2개의 Disposable가 담긴 튜플을 반환합니다.

3. DeferredSink

  • DeferredSinkSink의 자식 클래스이면서 ObserverType protocol을 준수합니다.
  • 인자값이 없고 ObservableTypeS를 반환하는 () -> S 을 소유하고 있습니다.
  • run()에서는 observableFactory를 호출하여 반환값인 Observablesubscribe하여 Disposable을 반환합니다. observableFactory을 호출하다가 에러가 발생하면 error을 발생시키고 dispose 한뒤 빈 Disposable을 반환합니다.
  • on(:)에서는 파라미터로 넘어온 이벤트를 방출시키고 error이거나 completed이면 dispose합니다.

4. Example

  • deferred에 count을 증가시키고 3개의 next 이벤트를 방출하는 Observable을 생성하여 반환하는 클로저를 파라미터로 넘겨서 deferred Observable을 생성합니다.
  • 생성된 deferred Observable을 2번 subscribe하면 subscribe 될때 넘겨준 클로저가 호출되기 때문에 count값이 달라져서 출력되는 것을 볼 수 있습니다.

Error

  • Error.swift에는 ObservableType extension 메소드와 1개의 클래스 ErrorProducer이 선언되어 있습니다.

1. error(:)

  • error(:)Swift.Error을 파라미터로 받고 ErrorProducer을 생성하여 반환합니다.

2. ErrorProducer

  • ErrorProducerProducer의 자식 클래스이며 Swift.Error을 소유하고 있습니다.
  • subscribe(:)을 오버라이드하여 error 이벤트를 방출하고 빈 Disposable을 반환합니다.

3. Example

  • TestError을 만들어 error Observable을 생성 후 subscribe하면 넘겨준 error 이벤트를 방출한 후 disposed됩니다.

Do

  • Do.swift에는 ObservableType extension 메소드와 2개의 클래스 Do, DoSink가 선언되어 있습니다.

1. do(onNext:onError:onCompleted:onSubscribe:onSubscribed:onDispose)

  • do(onNext:onError:onCompleted:onSubscribe:onSubscribed:onDispose)는 총 6개의 클로저를 파라미터로 받습니다.
  • self.asObservable()(Event<Element>) -> Void 타입의 onNext, onError, onCompleted를 호출하는 Throwing Closure와 onSubscribe, onSubscribed, onDisposeDo 생성자에 넘겨주어 Do를 생성하여 반환합니다.

2. Do

  • DoProducer의 자식 클래스입니다.
  • Observable<Element> 1개, (Event<Element>) throws -> Void 클로저 1개, (() -> ())? 클로저 3개를 소유하고 있습니다.
  • run(:cancel:)에는 DoSink을 생성하여 소유하고 있는 Observable<Element>sourcesubscribe(:)을 호출하여 observerDoSink을 넘겨주어 Disposable을 반환받습니다. 그리고 onSubscribed()을 호출하고 AnoymousDisposablesubscribe(:)을 호출하여 반환받은 Disposablesubscriptiondispose하고 onDispose을 호출하는 클로저를 넘겨주어 DoSink와 함께 튜플형태로 반환합니다.

3. DoSink

  • DoSinkSink의 자식 클래스이며 ObserverType을 준수합니다.
  • (Event<Element>) -> Void 타입의 Throwing Closure을 소유하고 있습니다.
  • on(:)에서 eventHandler을 호출하고 이벤트를 호출합니다.

4. Example

  • 설명한 코드대로 do에 넘겨준 이벤트 클로저가 먼저 호출되고 Observable의 이벤트가 호출되는 것을 볼 수 있습니다.

--

--