ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RxSwift - Observable<T>
    Ray Wenderlich/RxSwift 2018. 1. 30. 14:58

    Observable<T> ~ p.42


    Observable<T> 클래스는 Rx코드의 기반이 되는 클래스다.

    T타입에 대한 비동기 이벤트 시퀀스를 발생하는 역할을 한다. <- 이를 “Carry” 라고 표현함

    쉽게 말하면 다른 T타입에서 발생하는 변화들을 다른 클래스들에게 알려줄 수 있게 된다.


    하나의 Observable은 다수의 Observer가 subscribe할 수 있다.


    Observable<T>ObservableType 프로토콜을 따르는데, 이 매우 프로토콜은 간단하다.

    Observable은 3개의 이벤트를 발생시킬 수 있다.

    - next

    - completed

    - error

    이해를 위해 그림을 통해 살펴보자.

    Observable<Int>의 시퀀스 그림이다.  Observable<Int>는 Int에서 발생하는 데이터 변화를 Observe할 수 있다라고 이해하면 될듯?

    실제 상황을 예로 들어 설명해보겠다.

    인터넷에서 파일을 다운로드 받는다고 하자.

    1. 파일 다운로드를 시작하고, 다운로드 되는 데이터를 observe하기 시작한다.

    2. 파일 데이터의 junk를 다운로드 받는다.

    3. 만약 다운로드에 문제가 없다면, 모든 파일의 junk를 다운받고 성공적으로 다운로드가 종료된다.

    4. 다운로드에 문제가 발생한다면, 발생한 에러와 함께 파일 다운로드도 종료된다.


    이를 코드로 표현한다면?

    API.download(file: "http://www…”)Observable<Data>를 리턴한다. 

    즉, Observer들에게 Data타입에 발생하는 변화를 알려준다.

    - next이벤트를 발생 시, 다운로드받은 데이터의 junk를 append하고 있다.

    - error이벤트 발생 시,  에러를 표시한다.

    - complete이벤트 발생 시, 다운로드 받은 파일을 오픈한다.


    이정도는 스무스하게 이해 된다. 인정?


    Infinite Observable sequences

    파일 다운로드 예시와 달리, 시퀀스가 끝나지 않고 무한히 발생하는 경우가 있다. 이를 infinite Observable sequence라고 한다.

    이번에도 예를 들어보면, 아이폰 디바이스의 회전에 따른 orientation변경이 있겠다.

    - UIDeviceOrientationDidChange라는 Bool 타입을 observe한다.

    - 디바이스의 orientation이 바뀔때마다 이벤트가 발생한다.

    이 이벤트는 사실상 끝이 없다. 앱이 실행되는 한 항상 이벤트가 발생할 가능성이 있기 때문이다.

    또 하나의 특징은 항상 초기 값을 갖고 있다는 것이다. 이 경우는 아마도 vertical이나 horizontal에 관련된 초기값을 갖고 있겠다.


    그림과 코드로 표현해 보자면 아래와 같다.

    위 코드를 보면 onError, onCompleted파라미터가 생략되어 있다. infinite sequence이기 때문에 필요가 없는 것이다.


    Operators

    ObservableType과 Observable 클래스에는 비동기 작업을 처리하는데 필요한 어마무시한 양의 메소드가 있다.

    이 메소드들은 합쳐서 사용도 가능하고(composable), 메소드 서로서로는 관계가 없다(decoupled). 그래서 operator라고도 불린다.

    Operator들을 합쳐서 사용하면 복잡한 로직도 구현할 수 있게 된다.

    Operator들은 side effect를 발생시키지 않고, output을 생성하기 때문에 쉽게 합쳐서 쓸 수 있다. (메소드를 chaining해서 쓰는것으로 이해하면 됨)


    코드와 그림으로 살펴보자.

    1. filter를 통해 .landscape가 아닌 이벤트에 대해서만 이벤트를 통과시킨다.

    2. map을 통해 리턴타입이 Observable<Bool>이 아닌 Observable<String>이 되었다.

    3. 마지막으로 이를 subscribe하여 next이벤트 발생 시, alert로 문자열을 출력하고 있다.


    Schedulers

     스킵함


    App architecture

    RxSwift를 적용한다고 해서 앱 전체의 구조를 변경할 필요는 없다.

    MVC, MVP가 적용된 프로젝트에도 일부만 RxSwift를 적용하는것이 가능하다.

    하지만 MVVM이 RxSwift와 가장 어울린다.

    The reason MVVM and RxSwift go great together is that a ViewModel allows you to expose Observable<T> properties, which you can bind directly to UIKit controls in your View Controller glue code. This makes binding model data to the UI very simple to represent, and to code: 


    RxCocoa

    RxSwift는 Rx API를 구현한 것이다. 그래서 Cocoa, UIKit에 대해서는 알지 못한다.

    RxCocoa는 RxSwift를 UIKit과 Cocoa에 적용시킨 라이브러리이다. 예제 코드를 보자.

    UISwitch클래스의 isOn에서 발생하는 이벤트 시퀀스를 subscribe할 수 있다.

    댓글 2

Designed by Tistory.