Deferred
Deferred.swift
에는 ObservableType extension 메소드와 2개의 클래스Deferred
,DeferredSink
가 선언되어 있습니다.
1. deferred(:)
deferred(:)
는() -> Observable<E>
타입의 Throwing Closure을 파라미터로 받고Deferred
를 생성하여 반환합니다.
2. Deferred
Deferred
는Producer
의 자식 클래스이() -> S
타입의 Throwing Closure를 소유하고 있습니다.run(:cancel:)
에서는DeferredSink
을 생성하여run()
을 호출한 뒤DeferredSink
인스턴스와run()
의 반환값을 포함한 2개의Disposable
가 담긴 튜플을 반환합니다.
3. DeferredSink
DeferredSink
는Sink
의 자식 클래스이면서ObserverType
protocol을 준수합니다.- 인자값이 없고
ObservableType
인S
를 반환하는() -> S
을 소유하고 있습니다. run()
에서는observableFactory
를 호출하여 반환값인Observable
을subscribe
하여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
ErrorProducer
은Producer
의 자식 클래스이며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
,onDispose
을Do
생성자에 넘겨주어Do
를 생성하여 반환합니다.
2. Do
Do
는Producer
의 자식 클래스입니다.Observable<Element>
1개,(Event<Element>) throws -> Void
클로저 1개,(() -> ())?
클로저 3개를 소유하고 있습니다.run(:cancel:)
에는DoSink
을 생성하여 소유하고 있는Observable<Element>
인source
의subscribe(:)
을 호출하여observer
에DoSink
을 넘겨주어Disposable
을 반환받습니다. 그리고onSubscribed()
을 호출하고AnoymousDisposable
에subscribe(:)
을 호출하여 반환받은Disposable
인subscription
을dispose
하고onDispose
을 호출하는 클로저를 넘겨주어DoSink
와 함께 튜플형태로 반환합니다.
3. DoSink
DoSink
는Sink
의 자식 클래스이며ObserverType
을 준수합니다.(Event<Element>) -> Void
타입의 Throwing Closure을 소유하고 있습니다.on(:)
에서eventHandler
을 호출하고 이벤트를 호출합니다.
4. Example
- 설명한 코드대로 do에 넘겨준 이벤트 클로저가 먼저 호출되고 Observable의 이벤트가 호출되는 것을 볼 수 있습니다.