본문 바로가기

iOS/학습정리

iOS) RxSwift 가볍게 훑어보기 (1) Observable

Hello RxSwift

RxSwift란?

ReactiveX 라이브러리를 Swift 언어로 구현한 것이다.

그렇다면 ReactiveX는 무엇일까?
공식 홈페이지에 들어가보면 다음과 같이 적혀있다.

An API for asynchronous programming with observable streams

여기서 주목해야 할 키워드는 asynchronousobservable이다.

비동기적으로 발생한 이벤트를 관찰 가능하게 만들어 반응형 프로그래밍을 할 수 있도록 한다. 정확한 정의는 아니지만 지금 당장은 이정도로 생각해 볼 수 있다.

더 자세한 내용은 추후에 포스팅 할 계획이다.

왜 RxSwift?

그렇다면 장점은 무엇일까?

RxSwift의 장점은 단순하고 직관적인 코드를 작성할 수 있다는 것이다.

tableViewcollectionView를 구현할 때 전통적인 델리게이트 패턴을 이용하지 않고 단순한 코드로 구현할 수 있다.

viewModel
    .rows
    .bind(to: resultsTableView.rx.items(cellIdentifier: "WikipediaSearchCell", 
                                        cellType: WikipediaSearchCell.self)) { (_, viewModel, cell) in
        cell.title = viewModel.title
        cell.url = viewModel.url
    }
    .disposed(by: disposeBag)

KVONotification 역시 이전보다 더 단순한 코드로 구현할 수 있다. RxSwift github - Why를 보면 더 자세한 내용을 알 수 있다.

Observable

이벤트를 방출(emitting)하는 대상

Observable은 이벤트를 전달한다. ObserverObservable을 감시하고 있다가 전달되는 이벤트를 처리한다. Observable을 감시하는 것을 subscribe한다고 하여 Subscriber라고도 한다.

Observable이 방출하는 세 가지 이벤트

Next
Observable에서 발생한 새로운 이벤트는 Next 이벤트를 통해 전달된다.
이벤트에 값이 포함되어있으며, 이 과정을 Emission이라 한다.

Error / Completed
Observable에서 에러가 발생하면 Error 이벤트가 전달되고, Observable이 정상적으로 종료되면 Completed 이벤트가 전달된다.
두 이벤트는 Observable의 라이프 사이클에서 가장 마지막에 전달되는 이벤트이다. 이후 Observable이 종료되고 모든 resource가 정리되기 때문에 다른 이벤트가 전달되지 않는다.
보통 이 과정을 Notification이라 한다.

Marble Diagram

Observable과 연산자의 흐름을 시각적으로 표현

화살표는 상대적인 시간의 흐름이고 원은 이벤트, 더 정확히 Next Event를 말한다. 원 내부에 표시된 숫자는 이벤트에 저장된 값을 의미한다. 화살표 오른쪽에 있는 vertical bar는 완료, 즉 Completed Event이며, Observable의 life-cycle은 이곳에서 종료된다.

Error Event는 엑스로 표시하며, completed event와 마찬가지로 라이프사이클이 종료된다.

RxSwift Community - RxMarbles에서 프로젝트를 클론하여 앱을 설치하면 직접 이벤트를 이동시키면서 결과를 확인할 수 있다.
RxJS Marbles를 보면 js로 되어있지만 동일한 개념을 공유하므로 참고하면 좋다.

Observable 동작 직접 구현

두 개의 정수를 방출하고 종료하는 Observable을 두 가지 방법으로 구현해보자.

create 연산자

Observable<Int>.create { (observer) -> Disposable in
    observer.on(.next(0))
    observer.onNext(1) // on+next method를 더 간편하게 사용 가능

    observer.onCompleted()

    return Disposables.create()
}

from 연산자

Observable.from([0, 1])

위 코드는 Observable을 생성하고 이벤트가 어떤 순서로 전달되어야 하는지 정의한다. 아래 코드만으로는 정수가 방출되거나 이벤트가 발생하지 않는다. 이벤트가 발생하기 위해서는 ObserverObservable을 구독해야 한다.

참고