우선 가장 최상위 protocol에 대해서 살펴보겠습니다.
Disposable
Observable
의subscribe
들은 모두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가 선언되어 있습니다.ObserverBase
는Disposable
과ObserverType
을 준수하며,onCore(_ event: Event<E>)
추상메서드가 선언되어 있는 추상클래스입니다.
4. Disposables
Disposable
을 생성하는 Disposables에 대해서 알아보겠습니다.
Disposables.swift
에는Disposables
struct가 선언되어 있습니다.Disposables
클래스 메소드인create
는 어디에 선언되어 있을까요?
Disposables
create
는NoDisposable.swift
,AnoymousDisposable.swift
,BinaryDisposable.swift
,CompositeDisposable.swift
에 parameter가 다른 형태로 선언되어있습니다.Just
subscribe
에서는 parameter가 없는NopDisposable.swft
에 선언된create
를 호출하고 있습니다.
- 다시 한번
Just
의subscribe
를 보겠습니다.
Just
인스턴스로subcribe
를 호출하여Disposable
을 준수하NopDisposable
인스턴스를 반환하게 됩니다. 하지만NopDisposable
의dispose
에는 아무런 기능이 포함되어있지 않습니다.dispose
는 처분하다, 처리하다라는 뜻을 가지고 있습니다.NopDisposable
이외에 다른Disposable
들의dispose
는 넘겨받은disposable
의dispose
를 호출하고 객체를 메모리에서 해제합니다.
BinaryDisposable
을 예로 들면Disposable
2개를 parameter로 받습니다.dispose
에서는isDisposed
의 상태를 변경하고 넘겨받은disposable
의dispose
를 호출한 후 메모리에서 해제하고 있습니다.
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.create
에onDisposed
를 넘겨AnoymousDisposable
를 생성하고onDisposed
가 존재하지 않으면NopDisposable.swift
에 선언된Disposables.create
를 호출하여NopDisposable
를 생성합니다.
AnonymousObserver
은Event
를 인자값으로 받는 Closure을 소유하는 클래스입니다.- 각
Event
케이스마다 parameter로 넘겨주었던 각Event
케이스에 대한 closure를 호출하는 closure를AnonymousObserver
생성자에 넘겨서AnonymousObserver
인스턴스를 생성합니다. - 특이한 점은
error
와completed
이벤트에서는 상기 코드에서 생성하였던Disposable
인스턴스로dispose
를 호출하고 있습니다.
- 반환코드는
Disposable
parameter가 두개인BinaryDisposable
을 생성하여 반환합니다. - 첫 번째
Disposable
subscribe(_ on:)
에서 반환하는 것과 같은 해당Observable
인스턴스의subscribe<O: ObserverType>(_ observer: O)
를 호출하여 Disposable을 넘겨줍니다. - 상기 코드의
Observable
클래스는Just
이므로NopDisposable
을 넘겨주게 됩니다. - 두 번째
Disposable
은 메소드안에서 생성한Disposable
을 넘겨주게 됩니다.
Just
의subscribe
가 호출되면서onNext?(value)
와onCompleted?()
가 차례대로 호출된 후AnoymousDisposable
의dispose
를 호출하게 됩니다.- 출력 로그는 다음과 같이 나타나게 됩니다.
onNext : 1onCompletedonDisposed