[RxSwift] RxSwift란?

jinShine
jinshine 기술 블로그
7 min readJan 1, 2019

RxSwift 기본 구성요소 (Observables, Operators, Schedulers) 개념에 대해 알아 보겠습니다.

# 설치 방법

여기 RxSwift Github에 설치 방법에 대한 정보가 있습니다.

RxSwift는 Observable들의 순서를 사용하여 비동기 및 함수적 스타일 연산자를 사용하여 이벤트 기반 코드 작성을 위한 라이브러리로써 스케줄러를 통한 매개 변수화된 실행을하는 허용합니다.
Reactive Programming은 새로운 개념이 아닙니다.Rx는 변화할 수 있는 상태에 쉽게 대처 할 수 있고, 이벤트들의 순서의 구성과, 코드 분리, 재사용성등을 향샹 시킬 수 있습니다.

Foundation of RxSwift

Rx의 3가지 구성요소(Observables, Operators, Schedulers)에 대해 알아 보겠습니다.

1. Observables

Observable 클래스는 Rx 코드의 기반으로 T형태의 데이터를 전달 할 수 있는 이벤트들을 비동기적으로 생성하는 기능입니다. 간단하게 말해서, 다른 클래스에서 emit하는 값을 구독할 수 있게 해준다는 뜻입니다.

ObservableType 프로토콜(Observable가 준수함)은 매우 간단합니다.

  1. next : 최신/다음 데이터를 ‘전달’하는 이벤트
  2. completed: 성공적으로 일련의 이벤트들을 종료시키는 이벤트. 즉, Observable(생산자)가 성공적으로 자신의 생명주기를 완료했으며, 추가적으로 이벤트를 생성하지 않는다.
  3. error: Observable이 에러를 발생하였으며, 추가적으로 이벤트를 생성하지 않을 것임을 의미 (에러와 함께 완전종료)

< Finite Observable Sequences >

iOS 앱에서, 파일을 다운로드 하는 코드를 생각해보자.

  1. 다운로드를 시작하고, 들어오는 데이터를 관찰한다.
  2. 계속해서 파일 데이터를 받는다.
  3. 네트워크 연결이 끊어진다면, 다운로드는 멈출 것이고 연결은 에러와 함께 일시정지가 될 것이고, 그렇지 않으면 파일은 성공적으로 다운이 완료 될 것입니다.

이러한 흐름은 앞에서 서술한 Observable의 생명 주기와 정확히 일치합니다.

  • API.download(file:)은 네트워크를 통해 들어오는 Data값을 방출하는 Observable<Data> 인스턴스를 리턴할 것입니다. 또 onNext 클로저를 통해 next 이벤트를 받을 수 있다. 예제에서는 받은 데이터를 디스크의 temporary file에 저장하게 될 것입니다.
  • onError 클로저를 통해 error 이벤트를 받을 수 있다. alert 메시지 같은 action을 취할 수 있을 것입니다.
  • 최종적으로 onCompleted 클로저를 통해 completed 이벤트를 받을 수 있으며, 이를 통해 새로운 viewController를 push하여 다운로드 받은 파일을 표시하는 등의 엑션을 취할 수 있을 것입니다.

< Infinite Observable Sequences >

보통 UI 이벤트는 무한하게 관찰가능한 sequence입니다.

예를 들어, 기기의 가로/세로 모드에 따라 반응해야하는 코드를 생각해 보겠습니다.

  1. UIDeviceOrientationDidChange notifications을 추가.
  2. 방향 전환을 관리할 수 있는 callback method를 제공해야 하고, UIDevice의 현재 방향값을 확인 한 뒤, 이 값에 따라 화면이 표시될 수 있도록 해야한다.

방향전환이 가능한 디바이스가 존재하는 한, 이러한 연속적인 방향 전환은 자연스럽게 끝날 수 없다. 결국 이러한 시퀀스는 사실상 무한하기 때문에, 항상 최초값을 가지고 있어야 한다.

사용자가 디바이스를 절대 회전하지 않는다고 해서 이벤트가 종료된 것도 아닙니다. 단지 이벤트가 발생한 적이 없을 뿐.

해당 Observable에서는 onError나 onCompleted는 절대 발생하지 않을 이벤트이기 때문에 건너뛸 수 있습니다.

2. Operators

ObservableType과 Observable 클래스에는 복잡한 논리를 구현하기 위해 많은 메서드가 포함되어 있다. 이 메서드들을 Operator라고 부릅니다.

Operator는 비동기 입력을 받아 출력만 생성하기 때문에 Operator들끼리 쉽게 혼합해서 사용이 가능합니다. Rx Operatros들은 Observable의 의해 들어온 값들을 처리하고 최종값이 나올때 방출합니다.

위의 예제를 Operator를 추가해서 봤을때:

  1. filter는 .landsape가 아닌 값만 return하고. 디바이스가 landscape면 나머지 코드는 진행되지 않을 것입니다.
  2. .portrait값이 들어오면 map연산자는 해당 방향 값을 택할 것이고 String으로 변환한후 return 하고 있습니다.
  3. 마지막으로 subscribe를 통해 결과로 next 이벤트를 구현하게됨으로써 map에서 내려받은 String값을 표시하는 alert를 호출하게 됩니다.

연산자들은 언제나 입력된 데이터를 통해 결과값을 출력하므로, 단일 연산자가 독자적으로 할 수 있는 것보다 쉽게 연결 가능하며 훨씬 많은 것을 달성할 수 있다.

3. Schedulers

Rx의 Schedulers는 Swift에서 dispatch queue와 동일합니다. 다만 훨신더 강력하고 쉽다.
RxSwift에는 여러가지의 스케줄러가 이미 정의되어 있으며, 99%의 상황에서 사용가능하므로 아마 개발자가 자신만의 스케줄러를 생성할 일은 없을 것입니다.

RxSwift덕분에 좋은 performance를 위해 동일한 subscribe작업에 다른 스케줄러에서 스케줄링을 할 수 있습니다.
RxSwift는 구독(왼쪽)과 스케줄러(오른쪽)사이에서 발송인 역할을 할 것입니다.

이 다이어그램을 읽으려면 여러 스케줄러에서 색칠된 작업(1, 2, 3, …)을 순서대로 수행하시면 됩니다.

  • network subscription은 1로 표시된 Custom NSOperation Scheduler에서 구동된다.
  • 출력된 데이터는 다음 블록인 Background Concurrent Scheduler의 2로 가게 됩니다.
  • 이후, UI작업은 Main Thread Serial Scheduler에서 처리된다.

RxCocoa개념

RxSwift는 일반적인 Rx API라서, Cocoa나 특정 UIKit 클래스에 대한 아무런 정보가 없습니다. RxCocoa는 RxSwift의 동반 라이브러리로써 UIKit과 Cocoa 프레임워크 기반 개발을 지원하는 모든 클래스를 보유있습니다.

다음 2장에서는 Observables에 대해 알아보겠습니다.

참조 RxSwift: Reactive Programming with Swift

Florent Pillet, Junior Bontognali, Marin Todorov & Scott > Gardner Copyright ©2017 Razeware LLC.

--

--