RxSwift 깃허브 저장소를 살펴보며 작성했습니다.
Observable.create
Observable.create를 뜯어봅시다. create 메서드는 다음과 같이 정의되어 있습니다.
RxSwift/Observables/Create.swift
extension ObservableType {
public static func create(_ subscribe: @escaping (AnyObserver<Element>) -> Disposable) -> Observable<Element> {
return AnonymousObservable(subscribe)
}
}
create는 Observable자체가 아닌 ObservableType 프로토콜의 타입 메서드로 정의되어 있습니다.
Observable은 정의에서, ObservableType을 프로토콜로 채택하고 있습니다.
RxSwift/Observable.swift
public typealias RxObservable<Element> = RxSwift.Observable<Element>
public class Observable<Element> : ObservableType {
init() {
#if TRACE_RESOURCES
_ = Resources.incrementTotal()
#endif
}
...
다시 create 메서드를 보면 subscribe escaping 클로저를 인자로 받는데, 이는 AnyObserver를 인자로 하여 Disposable을 반환하는 타입의 클로저입니다.
일반적으로 create 를 할 때 전달하는 클로저는
{ observer in
observer.onNext(2)
observer.onCompleted()
return Disposables.create()
}
같은 형태로 넘겨주게됩니다. create메서드에서는 이 클로저를 그대로 사용하는 것이 아닌, AnonymousObservable의 생성자에 클로저를 그대로 넘기고, AnonymousObservable 자체를 리턴하고 있습니다.
RxSwift/Observables/Create.swift
final private class AnonymousObservable<Element>: Producer<Element> {
typealias SubscribeHandler = (AnyObserver<Element>) -> Disposable
let subscribeHandler: SubscribeHandler
init(_ subscribeHandler: @escaping SubscribeHandler) {
self.subscribeHandler = subscribeHandler
}
override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {
let sink = AnonymousObservableSink(observer: observer, cancel: cancel)
let subscription = sink.run(self)
return (sink: sink, subscription: subscription)
}
}
AnonymousObservable은 Create.swift 파일의 하단에 정의되어 있는데, 생성자로 escaping 클로저인 SubscribeHandler를 받아서 프로퍼티로 저장합니다. 결국 우리가 Observable.create 메서드로 전달한 클로저가 AnonymousObservable의 subscribeHandler 프로퍼티로 저장되고, 해당 AnonymousObservable 인스턴스 자체가 create 메서드의 결과로 반환된다고 볼 수 있겠습니다.
생각보다 간단하네요!
참고: https://github.com/ReactiveX/RxSwift
Uploaded by N2T