RxSwift Observable와 RxSwift Disposable에서는 Just
를 이용하여 Observable
의 생성과 Event
Life Cycle, dispose
에 대해서 알아보았습니다.
이번 스토리에서는 Observable의 Subclass인 Never
, Empty
, Sequence
에 대해서 알아보겠습니다.
먼저 Just에 대해서 다시 살펴보겠습니다.
Just
Just
는 Producer
의 자식 클래스이고 Producer
는 Observable
의 자식 클래스이면서, Observable
은 ObservableType
를 준순한다고 이야기하였습니다.
그래서 Just
인스턴스 생성은 ObservableType
에 default implementation된 just(:)
을 이용하여 다음과 같이 생성하였습니다.
ObservableType
은 protocol이므로Observable
을 이용하였습니다. 그렇다면, Observable의 자식 클래스인Producer
과Just
로just(:)
를 호출해서 생성하면 되지 않을까요?
Producer
의 Access Control은Internal
이고Just
는fileprivate
이므로Producer
은 RxSwift안에서만 접근이 가능하며Just
는Just.swift
에서만 접근이 가능합니다. 즉Observable
Subclass 생성은Observable
을 통해서만 생성이 가능하게 됩니다.
이제부터 Just
이외에 다른 Observable
Subclass에 대해서 RxSwift의 swift 파일 기준으로 알아보도록 하겠습니다.
하지만 RxSwift 다이어그램에서도 봤듯이 Observable Subclass의 갯수는 꽤 많습니다.
그래서 이번 스토리에서는 간단한 Observable
Subclass 몇가지에 대해서 이야기하겠습니다.
RxSwift Observable와 RxSwift Disposable에서 Just
디버깅을 잘 따라 오셨다면 쉽게 이해가 될 것 입니다.
Never
Never.swift
에는Just
와 마찬가지로Producer
을 상속받은NeverProducer
와ObservableType
에never
가 선언되어 있습니다.NeverProducer
subscribe
는 아무런 기능을 하지 않고NopDisposable
을 반환합니다.NopDisposable
또한 아무런 기능이 없는 struct입니다.
never
는 초기값을 갖지 않으므로 Swift.Generic이 타입을 유추하지 못해서Element
에 Data Type을 지정해주어야 합니다.NeverProducer
의subscribe
는 아무런 기능이 없으므로 아무런 로그도 출력되지 않습니다.
Empty
Empty.swift
에도Producer
을 상속받는EmptyProducer
와ObservableType
에empty
가 선언되어 있습니다.EmptyProducer
은NeverProducer
와 유사하지만subscribe
에서completed
이벤트를 호출하는 점이 다릅니다.
empty
역시 초기값을 갖지 않으므로Element
에 Data Type을 지정해 주어야 합니다.EmptyProducer
subscribe
에 선언된 대로completed
로그를 출력하게 됩니다.
Sequence
Sequence.swift
에는 3개의Observable
생성 method와 2개의 class가 존재합니다.
Sequence.swift
에서 처음보는 Data Type들이 존재합니다.ImmediateSchedulerType
은 protocol이고CurrentThreadScheduler
은ImmediateSchedulerType
을 준수하는 class입니다.Sink
는 Disposable을 준수하는 class입니다.
우선 of
, from
이 반환하는 Observable
인 ObservableSequence
에 대해서 알아보겠습니다.
1. ObservableSequence
Sequence
protocol을 준수하는 1개의 elements와ImmediateSchedulerType
protocol을 준수하는 scheduler을 소유하고 있습니다.Producer
의Element
는Sequence
의Iterator.Element
를 정의하고 있습니다.run(:cancel:)
을 오버라이드하여 튜플 형태로 2개의Disposable
을 반환하고 있습니다.
이제 ObservableSequenceSink
에 대해서 알아보겠습니다.
2. ObservableSequenceSink
- Generic을 이용하여
S
는Sequence
protocol을 준수하고O
는ObserverType
protocol을 준수합니다. 또한S
의Iterator.Element
는O
의E
와 같아야합니다. - 생성자에
ObservableSequence
가 추가되어 parent 변수명으로 소유하고 있으며ObserverType
과Cancelable
은Sink
생성자를 호출하고 있습니다. run()
이 선언되어 있으며ObservableSequence
의scheduler
인ImmediateSchedulerType
의schedulerRecursive
를 호출하여Disposable
을 반환하고 있습니다.
그럼 이제 ObservableSequenceSink
의 부모클래스인 Sink
에 대해서 알아보겠습니다.
3. Sink
Sink.swift
에는 2개의 classSink
와SinkForward
가 선언되어 있습니다.
- Sink는 Disposable protocol을 준수하는 클래스이며
O
가ObserverType
을 준수하는 Generic이 정의되어 있습니다. ObserverType
과Cancelable
그리고 disposed 여부를 나타내는 bool 변수를 소유하고 있습니다.forwardOn(:)
을 통하여 disposed되지 않으면 이벤트를 발생시키고 disposed되었으면 아무런 동작도 하지 않습니다.forwarder()
을 통하여SinkForward
를 반환합니다.dispose()
를 정의하여_disposed
를 true로 변경하고cancel
의 dispose를 호출합니다.
SinkForward
는final
키워드가 선언되어 있어 부모클래스로 사용할 수 없습니다.O
는ObserverType
protocol을 준수하는 Generic이 정의되어있습니다.Sink
인_forward
를 소유하고 있습니다.on(:)
을 통하여_forward
의observer
를 통하여 이벤트를 방출합니다.
Sequence.swift
에서 반환하고 있는 ObservableSequence
에는 subscribe
가 오버라이드 되어 있지 않으므로 Producer
의 subscribe
가 호출됩니다. 그럼 Producer
subscribe
에 대해서 알아보도록 하겠습니다.
4. Producer
이전 스토리에서 Producer
에 대해서 간략하게 다루었습니다.
Producer.swift
에는 2개의 classProducer
와SinkDisposer
이 선언되어 있습니다.
우선 SinkDisposer
에 대해서 알아보겠습니다.
SinkDisposer
은fileprivate
키워드로 선언되어 있어서Producer.swift
에서만 접근이 가능합니다.Cancelable
protocol을 준수하고 있습니다.AtomicInt
는 RxSwift에서Int32
의 별칭입니다.Int32
인_state
와 2개의Disposable
_sink
,_subscription
을 소유하고 있습니다._state
을 이용하여Disposed
여부를 체크하고 있습니다.setSinkAndSubscription(sink:subscription:)
을 통하여 2개의Disposable
을 설정하고_state
을sinkAndSubscriptionSet
와 or연산을 하여 상태가disposed
이면 넘겨받은Disposable
을dispose
합니다.dispose()
에서는_state
을disposed
와 or연산을 하고 2개의Disposable
을dispose
합니다.
CurrentThreadScheduler
의isScheduleRequired
여부에 따라SinkDisposer
을 생성하는 부분을schedule
에 넘겨줄지 바로 실행시킬지 결정됩니다.SinkDisposer
인disposer
을 생성하여 자신의 추상메소드run(:cancel:)
에 넘겨받은observer
와disposer
을 넘겨주어 호출하여 반환된 2개의 Disposable을 담고있는 튜플을 저장합니다.- 넘겨받은 2개의
Disposable
을disposer
의setSinkAndSubscription(sink:subscription:)
에 넘겨준 후disposer
을 반환합니다.
이로써 Producer
의 내부 동작에 대해서 알아보았습니다. 여기까지 따라오시느라 고생하셨습니다.
이제 다시 Sequence.swift
로 돌아가서 of
와 from
에 대해서 알아본 후 ObservableSequence
subscribe
을 디버깅해보겠습니다.
5. of
- 갯수가 정해지지 않는
Element
를 받는 Variadic Parameters와CurrentThreadScheduler.instance
가 default인ImmediateSchedulerType
을 parameter로 받고 있습니다. - 그리고
ObservableSequence
객체를 생성하여 반환하고 있습니다.
예제를 한번 보겠습니다.
- 1,2,3을 가진
ObservableSequence
가 생성되어 차례대로next
이벤트를 방출하고completed
이벤트를 방출합니다.
6. from
from
은array
또는sequence
를 받아서ObservableSequence
를 생성하는 2개의 메소드가 존재합니다.- 예제를 한번 보겠습니다.
array
나sequence
형태로 파라미터를 넘겨주어야 하기 때문에 1,2,3을 가지는 int 배열을 넘겨주어Observable
을 생성하여subscribe
하면 차례대로next
이벤트를 방출하고completed
이벤트를 방출합니다.
7. Sequence subscribe
- 그럼 이제
of
와from
의subscribe
를 디버깅해보겠습니다. - 즉
ObservableSequence
의subscribe
를 디버깅해보겠습니다.
ObservableSequence
에는subscribe(:)
가 오버라이드 되어있지 않으므로 부모클래스인Producer
의subscribe
가 호출되면서run(:cancel)
을 호출하게 됩니다.ObservableSequence
에는run(:cancel)
을 오버라이드 되어 있으므로ObservableSequence
의run
이 호출됩니다.ObservableSequence
의run(:cancel)
에서는ObservableSequenceSink
을 생성하고ObservableSequenceSink
의run()
을 호출하게 됩니다.ObservableSequenceSink
의run()
에서는ObservableSequence
의scheduler
을 이용하여scheduleRecursive
에서sequence
의element
를 순서대로next
이벤트를 방출하고 더이상next
가 없으면completed
이벤트를 방출하면서dispose
합니다.