RxSwift Disposable

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

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

우선 가장 최상위 protocol에 대해서 살펴보겠습니다.

Disposable

  • Observablesubscribe들은 모두 Disposable 를 반환합니다.
  • Disposable.swift에는 Disposable protocol이 정의되어 있고 dispose() 가 선언되어 있습니다.
  • Cancelable.swift 에는 Disposable 을 준수하는 Cancelable protocol이 선어되어 있고 isDisposed property가 추가되었습니다.

그럼 이제 Disposable 이 만들어지는 과정을 디버깅해보겠습니다.

subscribe(_ on:)

  • 상기 코드를 디버깅해보겠습니다.

1. subscribe(_ on: @escaping (Event<E>) -> Void) -> Disposable

  • 디버깅을 위해서 필요한 Just , Producer , Observable 의 코드를 다시 보도록 하겠습니다.
  • 디버깅하려는 코드에서Just 인스턴스는 ObservableType 의 extension 메소드로 선언된 subscribe(_ on:) 을 호출하고 있습니다.
  • subscribe(_ on:)에서는 asObservable() 을 호출하여 self 를 반환하고 Just 에서 오버라이딩된 subscribe(_ observer: ObserverType) 을 호출하여 넘겨받은 observer 인자로 next 이벤트와 completed 이벤트를 호출한 후 Disposables.create() 를 호출하여 Disposable 을 반환합니다.
  • 출력 로그는 다음과 같이 뜨게 됩니다.
next(1)completed

그러면 이제 또 새롭게 등장한ObserverType , Disposables 그리고 observer 인자로 넘겨준 AnonymousObserver 에 대해서 알아보겠습니다.

2. ObserverType

  • Observable subscribe 의 인자 ObserverType 에 대해서 알아보겠습니다.
  • ObserverType.swift 에는 ObserverType protocol과 default implementations로 선언된 메소드가 선언되어 있습니다.
  • Event 케이스 별로 onNext(:) , onCompleted() , onError(:) 가 존재하고 각각 메소드에서 on(:) 에 해당 Event 케이스를 인자값으로 넘겨줍니다.

3. AnoymousObserver

  • subscribe(_ on: @escaping (Event<E>) -> Void)에서 subscribe<O: ObserverType>(_ observer: O) 에 넘긴 observer AnoymousObserver 에 대해서 알아보겠습니다.
  • AnonymousObserver.swift에는 AnonymousObserver class가 선언되어 있습니다.
  • Event 를 인자값으로 받는 closure를 서유하고 있으며 onCore(_ event: Event<Element>)를 통해서 closure를 호출하는 class입니다.
  • ObserverBase.swift에는 AnonymousObserver의 부모 클래스인 ObserverBase class가 선언되어 있습니다.
  • ObserverBaseDisposableObserverType을 준수하며, onCore(_ event: Event<E>) 추상메서드가 선언되어 있는 추상클래스입니다.

4. Disposables

  • Disposable을 생성하는 Disposables에 대해서 알아보겠습니다.
  • Disposables.swift에는 Disposables struct가 선언되어 있습니다.
  • Disposables 클래스 메소드인 create는 어디에 선언되어 있을까요?
  • Disposables createNoDisposable.swift, AnoymousDisposable.swift, BinaryDisposable.swift, CompositeDisposable.swift에 parameter가 다른 형태로 선언되어있습니다.
  • Just subscribe에서는 parameter가 없는 NopDisposable.swft에 선언된 create를 호출하고 있습니다.
  • 다시 한번 Justsubscribe를 보겠습니다.
  • Just 인스턴스로 subcribe를 호출하여 Disposable을 준수하NopDisposable 인스턴스를 반환하게 됩니다. 하지만 NopDisposabledispose에는 아무런 기능이 포함되어있지 않습니다.
  • dispose는 처분하다, 처리하다라는 뜻을 가지고 있습니다. NopDisposable 이외에 다른 Disposable들의 dispose는 넘겨받은 disposabledispose를 호출하고 객체를 메모리에서 해제합니다.
  • BinaryDisposable을 예로 들면 Disposable 2개를 parameter로 받습니다.
  • dispose에서는 isDisposed의 상태를 변경하고 넘겨받은 disposabledispose를 호출한 후 메모리에서 해제하고 있습니다.

subscribe(onNext:, onError:, onCompleted:, onDisposed:)

subscribe(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) -> Disposable

  • ObservableType+Extensions.swift에 선언된 subscribe 중 두 번째 subscribe에 대해서 디버깅을 해보겠습니다.
  • 상기 코드를 디버깅 해보겠습니다.
  • Event 케이스에 대한 closure와 disposed에 대한 closure를 parameter로 받고 Disposable를 반환합니다.
  • Disposable를 하나 선언한 후 onDisposed가 존재하면 AnoymousDisposable.swift에 선언된 Disposables.createonDisposed를 넘겨 AnoymousDisposable를 생성하고 onDisposed가 존재하지 않으면 NopDisposable.swift에 선언된 Disposables.create를 호출하여 NopDisposable를 생성합니다.
  • AnonymousObserverEvent를 인자값으로 받는 Closure을 소유하는 클래스입니다.
  • Event 케이스마다 parameter로 넘겨주었던 각 Event 케이스에 대한 closure를 호출하는 closure를 AnonymousObserver 생성자에 넘겨서 AnonymousObserver 인스턴스를 생성합니다.
  • 특이한 점은 errorcompleted 이벤트에서는 상기 코드에서 생성하였던 Disposable 인스턴스로 dispose를 호출하고 있습니다.
  • 반환코드는 Disposable parameter가 두개인 BinaryDisposable을 생성하여 반환합니다.
  • 첫 번째 Disposable subscribe(_ on:)에서 반환하는 것과 같은 해당 Observable 인스턴스의 subscribe<O: ObserverType>(_ observer: O)를 호출하여 Disposable을 넘겨줍니다.
  • 상기 코드의 Observable 클래스는 Just이므로 NopDisposable을 넘겨주게 됩니다.
  • 두 번째 Disposable은 메소드안에서 생성한 Disposable을 넘겨주게 됩니다.
  • Justsubscribe가 호출되면서 onNext?(value)onCompleted?()가 차례대로 호출된 후 AnoymousDisposabledispose를 호출하게 됩니다.
  • 출력 로그는 다음과 같이 나타나게 됩니다.
onNext : 1onCompletedonDisposed

--

--