RxSwift

[RxSwift] ObservableType.swift 파일을 열어보자!

JoonSwift 2022. 2. 8. 23:40

RxSwift의 ObservableType.swift 파일을 열어보았습니다! 

ObservableConvertibleType.swift

public protocol ObservableType: ObservableConvertibleType {

ObservableType 옆에 ObservableConvertibleType이 붙어있어서 먼저 확인해보겠습니다. 

public protocol ObservableConvertibleType {
    associatedtype Element
    
    func asObservable() -> Observable<Element>
}

ObservableConvertibleType이라는 프로토콜입니다.

코드를 열어보면 위의 코멘트에서도 알 수 있지만, Type that can be converted to observable sequence (`Observable<Element>`).  Observable sequence로 변환될 수 있는 타입입니다.

Element라는 associatedtype을 가지고 있고, asObservable() -> Observable<Element> 라는 메서드 또한 가지고 있습니다.

 

여기서 Element는 Sequence의 요소들(elements)의 타입입니다. 또한 asObservable() 메서드는 이 프로토콜을 채택하는 self를 Observable sequence로 변환시켜주는 역할을 할 것입니다.

 

네이밍덕에 더 이해하기 쉬운 프로토콜이네요! ObservableConvertibleType = Observable로 변환될 수 있는 타입.

ObservableType.swift

이제 이 ObservableConvertibleType을 채택하여 ObservableType으로 가보겠습니다. 

/// Represents a push style sequence.
public protocol ObservableType: ObservableConvertibleType {

위의 코멘트를 한번 느낌가는대로 해석해보면 Sequence인데, push 하는 형식의 Sequence를 나타내는것 같습니다. 

Subscribe

Sequence(ObservableType) 의 이벤트들을 받기 위해서는 observer가 Subscribe 해야합니다. 이를 위해 ObservableType은 subscribe라는 메서드를 제공하고 있군요!

func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element

ObserverType, Disposable 등은 다른 포스팅에서 정리해보도록 하겠습니다 ㅎㅎ! 

이 subscribe 메서드에 대한 코멘트가 많은데, 우선 규칙(Grammar) 부터 살펴보겠습니다.

  • Sequence들은 0 또는 그보다 많은 element를 생성할 수 있고, 이 말은 0 또는 그 이상의 Next 이벤트를 observer에게 보낼 수 있다는 의미입니다.
  • Error 나 Completed 이벤트가 보내지면, Sequence가 종료되고, 더이상 element를 생성할 수 없는 상태가 됩니다. 

특히, 서로 다른 스레드에서 이벤트가 보내질 수는 있지만, 두개의 이벤트들이 동시에 observer에게 전달되는 것은 불가능하다고 합니다.

 

자원 관리에 관한 부분도 있습니다.

Sequence가 Completed나 Error 이벤트를 전송하면, Sequence 요소들(elements)을 계산(computed)하고 있던 모든 내부 자원들을 반환합니다. 

Sequence 요소들의 생성을 중단하고, 모든 자원을 즉시 반환하고 싶다면, 반환할 Subscription에서 dispose를 호출해주면 됩니다. 

 

반환값으로는 Sequence 요소들의 생성을 취소하고, 자원을 반환할 때 사용 가능한 observer를 위한 Subscription을 반환해준다고 합니다. ( 이 부분에 대한 해석이 조금 어렵네요! returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources.)

 

ObservableType.swift 파일의 마지막으로 

extension ObservableType {
    /// Default implementation of converting `ObservableType` to `Observable`.
    public func asObservable() -> Observable<Element> {
        Observable.create { o in self.subscribe(o) }
    }
}

ObservableConvertibleType의 채택하면서 구현해야할 asObservable() 메서드가 있습니다. 여기서 Observable.create라는 create operator도 나오는데, 이 부분도 다른 포스팅에서 자세히 다루어보겠습니다. 

우선은 위의 코멘트처럼 ObservableType 즉 self 를 Observable<Element> 로 변환해주는 메서드임을 쉽게 확인할 수 있습니다. 

정리

이렇게 RxSwift의 수많은 파일 중 두 파일을 열어보았는데, 알 수 있었던 점은 ObservableType은 하나의 Sequence라고 볼 수 있는데, 이 Sequence에서 일어나는 이벤트들을 observer가 받아볼 수 있게 subscribe라는 메서드를 제공하고 있었습니다. 

또한 ObservableConvertibleType 프로토콜을 채택하면서, 어떤 Type을 Observable sequence로 변환해줄 수 있는 능력(?) 또한 가지고 있는 것을 확인할 수 있었습니다. 

 

'RxSwift' 카테고리의 다른 글

[RxSwift] ObserverType.swift 둘러보기  (0) 2022.02.14