ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RxSwift - Observable
    Programming/RxSwift 2022. 3. 5. 22:38

     

    안녕하세요 BeePeach입니다 :)

     

    오늘 공부해볼 내용은 RxSwift에서 가장 기초가 되는 Observable입니다.

     

     


     

    Observable이란??

     

    Observable, ObservableSequence, Sequence라고 불립니다.

    모두 같은 말이고 주로 Observable이라는 단어를 사용합니다.

     

    Observable은 하나의 sequence, 즉 흐름입니다.

    일정 기간 동안 event를 발생시키는데 이를 emit(방출)한다고 표현합니다.

    그리고 이 모든것들은 asynchronous하게 동작합니다.

     

    RxSwift에서 asyn한 코드를 처리하는 것은 사용 이유 중에 하나라고 했었죠??

    만약 우리가 Swift에서 async한 코드를 작성하려고 한다면 주로 completionHandler를 이용하거나 delegate를 이용합니다.

    기존의 방식이 나쁘지는 않지만 callback 메서드를 사용해야하거나 delegate를 지정해준 후에 이후에 데이터를 처리하는 코드를 따로 작성해주어야 하기 때문에 시선이 분산되고 코드의 가독성은 줄어들게 됩니다.

     

    하지만 RxSwift에서는 이런 방식을 사용하지 않고 적절한 시점에 데이터를 담은 이벤트를 방출하는 방법을 이용합니다.

    그럼 Observer(Consumer)는 방출된 이벤트를 받아서 데이터를 처리하게 됩니다.

     

     


     

    ObservableType

     

    그럼 Swift에서는 어떻게 Observable을 구현했을까요??

     

     

    Observable을 class로 캡슐화시켰습니다. 

     

    지금은 코드를 봐도 이해가 안가겠지만 

    1. Observable은 Generic class이다.
    2. ObservableType 프로토콜을 채용하고 있다.
    3. subscribe(_:), asObservable() 메서드가 정의되어있다.

    이렇게 되어있구나 정도만 보고 넘어가시면 됩니다.

     

     

     

     

    ObservableType

     

    그럼 Observable이 채용하고 있던 ObservableType 프로토콜에는 어떤 요구 멤버가 정의되어 있는지 살펴보겠습니다.

     

    Observable에서 봤던 subscribe 메서드가 정의되어 있습니다. 이후에 이 메서드를 이용해서 Observable에서 방출하는 이벤트를 받아서 처리하는 코드를 작성하게 됩니다.

    여기서는 파라미터로 ObserverType을 받는것을 기억해주시면 됩니다.

     

    그리고 마지막으로 이 프로토콜은 또 ObservableConvertibleType을 채용하고 있는 것을 볼 수 있습니다.

     

    이후에 공부하겠지만 Subject등 Observable의 역할을 할 수 있는 객체가 있다면 모두 ObservableType 프로토콜을 채용하고 있는 것을 확인할 수 있습니다.

     

     

     

     

    ObservableConvertibleType

     

    이 프로토콜은 어떤 객체를 Observable로 변환 시킬 수 있는 asObservable()을 정의하고 있습니다.

     

     


     

    ObserverType

     

    subscribe(_:) 메서드에서 ObserverType을 파라미터로 받는 것을 보았습니다.

    subscribe라는 개념에 대해서는 이후에 자세히 공부하겠습니다.

     

    간단히 말하자면

    Rx의 기본개념에서 Observable과 Observer는 stream(seqence)로 연결한 후에 이걸 통해서 데이터를 전달한다고 했습니다.

    여기서 Observable과 Observer를 연결할때 사용하는 게 subscribe(_:) 메서드입니다.

     

    Observer에서는 Observable에서 방출된 이벤트를 받아서 데이터를 처리합니다.

     

     

     

    ObserverType 프로토콜을 살펴보면 on(_:)  메서드가 정의되어 있습니다.

    이 메서드를 이용해서 Observer에게 이벤트를 전달할 수 있습니다.

     

    Observer의 역할을 할 수 있는 객체라면 이 프로토콜을 채용하고 있는 것을 이후에 확인하실 수 있습니다.

     

    그럼 여기서 on(_:)에 파라미터로 전달되는 이벤트란 뭔지 살펴보겠습니다.

    사실 이 Event를 보기위해서 ObservableType부터 ObserverType까지 살펴봤습니다.

     

     


     

    Event

     

    Event 코드를 확인해보면 enum으로 선언되어 있습니다.

    Observable이 방출하는 이벤트는 next, completed, error 세 가지 case가 있습니다.

     

    Next 이벤트에는 element를 담아서 방출합니다.

    element는 제네릭으로 되어있기 때문에 다양한 것들을 포함할 수 있습니다.

    인스턴스는 당연히 가능하고 tap과 같은 제스처도 포함할 수 있습니다.

     

    Completd와 Error는 observable을 종료시키는 이벤트입니다.

    Completed 이벤트를 방출하면 그 이후부터 Observable이 더 이상 이벤트를 방출하지 않습니다.

     

    헷갈리면 안 되는 게 내가 원하는 next이벤트를 에러 없이 방출했다고 completed 이벤트를 방출하는 게 아닙니다.

    Observerble이 더 이상 이벤트를 방출하고 싶지 않을 때 completed 방출합니다.

    그 이유는 Observable Lifecycle과 관련이 있습니다.

     

    Error 이벤트는 error를 담아서 방출합니다.

    Completed와 마찬가지로 error이벤트가 방출되면 더 이상 Observable은 이벤트를  방출하지 않습니다.

     

     


     

    Observable Lifecycle

     

    위에서 설명했듯이 Observable도 lifecycle을 가지고 있습니다.

    Observable은 completed 또는 error 이벤트를 방출하기 전까지 계속해서 적절한 시점에 next 이벤트를 방출할 수 있습니다.

    만약 completed나 error가 방출됐다면 더 이상 이 Observable은 next이벤트를 방출하지 않습니다.

     

    Observable의 작동을 시각적으로 표현한 것을 Marble Diagram이라고 합니다.

     

     

    화살표는 시간의 흐름을 나타냅니다.

    그리고 각각 노드는 next 이벤트를 의미합니다.

    20을 담은 next이벤트가 방출되고 이후에 40, 60 ... 이렇게 방출된 것을 나타낸 것입니다.

    그리고 마지막에 '|' 는 completed 이벤트를 의미합니다. 

     

     

    출처 : https://www.raywenderlich.com/books/rxswift-reactive-programming-with-swift/v4.0/chapters/2-observables

    X는 error를 나타냅니다.  

     

    Mable diagram을 쉽게 확인해볼 수 있는 사이트가 있습니다.

    심심하시면 한번 들어가서 어떻게 작동하는지 구경해보시면 좋을 거 같네요.

     

     

    https://rxmarbles.com

     

    RxMarbles: Interactive diagrams of Rx Observables

     

    rxmarbles.com

         

     


     

    Observable 생성하기 

     

    지금까지 Observable에 대해서 알아보았습니다.

    그럼 Observable을 생성하는 방법에 대해서 알아봐야겠죠??

     

     

    Observable은 제네릭 타입입니다.

    그래서 생성할 때 Element의 타입을 지정해주어야 합니다.

     

    Observable을 생성하는 방법에는 여러 가지가 있습니다.

    Observable에서 제공하는 TypeMethod를 이용할 건데요.

    RxSwift에서는 Method를 Operator라는 용어로 부릅니다.

     

     

    create

    가장 기본적인 operator는 create(_:)입니다.

    기본적이긴 한데 처음에 보면 이해가 안 될 겁니다.

    일단은 이런 게 있구나 하고 넘어가시면 될 거 같아요.

    처음에는 이후에 설명할 operator가 더 이해하기 쉽습니다.

     

     

    파라미터로 클로저를 받아서 Observable을 리턴합니다.

    여기서 제네릭 타입 파라미터가 Int인 것은 제가 Observable<Int>로 생성했기 때문입니다.

     

    클로저를 보면 AnyObserver를 받아서 Disposable을 리턴하는데..

    아직 Observer와 Disposable에 대해서는 공부하지 않았으니 자세한 설명은 넘어가도록 하겠습니다. 이후에 다시 설명하도록 할게요.

    간단히 설명하자면 이 클로저에서 Observer에게 이벤트를 어떻게 전달할 지 구현하면 됩니다.

     

    일단 예제를 보도록 하겠습니다.

     

     

    이 코드는 잘못된 부분이 몇 가지 있습니다.
    completed, error를 호출한 이후에 observable은 더 이상의 이벤트를 방출하지 않기 때문에 Line8, 10, 11은 의미가 없는 코드입니다.

    하지만 여기서는 이렇게 이벤트를 전달한다를 설명드리고자 작성했기 때문에 감안하고 봐주세요!

     

    Observable는 제네릭 타입이기 때문에 생성할 때는 element의 타입을 적어주어야 합니다.

    저는 Int타입의 element를 담기 위해서 Observable<Int>로 생성했습니다.

     

    이제 클로저 내부에서 이벤트 전달을 구현하면 됩니다.

    간단하게 next, completed, error 이벤트를 전달하는 방법에 대해서 작성했습니다.

    이벤트를 생성하는 것은 on(_:) 또는 onNext(_:), onCompleted(), onError(_:)를 사용합니다.

    next에는 element를 담으면 되고 error에는 Error를 담으면 끝입니다.

     

    여기서는 간단하게 아무 조건없이 10 이라는 데이터를 담은 next 이벤트를 2번 방출한뒤에 completed 이벤트를 방출했습니다.

    물론 뒤에 또 completed를 방출하고 error를 2번 방출하도록 했는데 이는 앞에서 설명한대로 실행되지않는 의미없는 코드입니다.

     

    아주 간단한 Observable을 생성하고 싶은데 매번 create(_:)를 이용하면 불편합니다.

    그래서 제공해주는 operator가 just, of, from입니다.

     

     

     

    just

     

    간단하게 하나의 next 이벤트만 방출한뒤 completed 이벤트를 방출하는 observable을 생성하려면 이 operator를 이용합니다.

    이름처럼 간단하게 1개의 element를 포함한 observable를 생성합니다.

     

     

    1을 포함한 next 이벤트를 방출하는 observable을 생성했습니다.

    담긴 element를 통해서 타입 추론이 가능하기 때문에 제네릭 파라미터를 생략해도 괜찮습니다.

     

     

     

    of

    여러 개의 element를 포함하는 Observable을 생성할때는 of(_:)를 사용합니다.

    파라미터를 보면 variadic 파라미터입니다.

     

     

    파라미터로 여러개의 element를 보내면 차례대로 하나씩 방출하는 observable을 생성합니다.

    [1, 2, 3]이 아니라 1, 2, 3을 방출하는 operator입니다.

     

    반드시 하나의 Next이벤트만을 방출해야한다는 경우가 아니라면 just(_:)는 잘 사용하지 않습니다.

    1개의 element를 방출하는 observable을 생성할 때 of(_:)를 사용해도 됩니다.

     

     

     

    from

    from(_:)은 파라미터로 array를 받습니다.

    array를 받아서 내부에 element들을 차례대로 방출하는 observable을 생성합니다.

    코드를 확인해볼게요!

     

     

    [10, 20, 30]을 방출하는 게 아니라 of처럼 10, 20, 30을 방출하는 Observable을 생성합니다.

     

    of(_:)에서 [10, 20, 30]을 전달하는 것과 from에서 [10, 20, 30]을 전달하는 것의 차이를 확인해보세요.

     

     

     


     

    지금까지 Observable이 무엇인지 그리고 생성하는 방법에 대해서 알아보았는데요.

     

    중요한 것은 Observable을 생성만 했지 사용하지 않았습니다.

    Observer에게 이런 이벤트를 방출할거야 라고 정의만 한 것입니다.

    그래서 Observable은 아무런 이벤트도 방출하지 않습니다.

     

    Observable이 이벤트를 방출하는 시점은 Observer가 Observable을 구독하는 시점입니다.

     

    그래서 다음 포스팅에서는 Observer와 Observable을 구독하는 방법에 대해서 공부해보겠습니다.

     

     


     

    참고자료

     

    https://kxcoding.com

     

    여러분의 새로운 도전을 응원합니다 | KxCoding

    Mastering SwiftUI 더 적은 코드로, 더 멋진 UI 만들기

    kxcoding.com

     

     

    https://www.raywenderlich.com/books/rxswift-reactive-programming-with-swift/v4.0/chapters/2-observables

     

    RxSwift: Reactive Programming with Swift, Chapter 2: Observables

    Now that you’re ready to use RxSwift and have learned some of the basic concepts, it’s time to play around with observables.

    www.raywenderlich.com

     

     

     

     

     

    728x90

    'Programming > RxSwift' 카테고리의 다른 글

    RxSwift - Trait  (0) 2022.03.24
    RxSwift - Observable factory  (0) 2022.03.21
    RxSwift - Disposable  (0) 2022.03.17
    RxSwift - Subscribe  (0) 2022.03.17
    RxSwift - 개요  (0) 2022.03.03
Designed by Tistory.