RxSwift == Reactive eXtension + Swift
관찰 가능한 시퀀스를 사용하여 비동기 및 이벤트 기반 프로그램을 구성하기 위한 라이브러리
https://github.com/ReactiveX/RxSwift
스위프트는 함수형 프로그래밍 패러다임을 강조하는 언어인데, RxSwift는 이에 반응형 프로그래밍을 더해서 Swift에서 FRP(Functional Reactive Programming) 패러다임을 따를 수 있도록 한다.
아래 코드에서 combineLatest()나 map() 같은 연산자를 RxSwift에서 **Operator**라고 부른다.
Operator를 사용해서 이벤트의 값을 여러 형태로 조합하거나 변경할 수 있다.MVVM 패턴을 적용할 때 View ↔ ViewModel을 연결해주는 데이터 바인딩을 수행해야 하는데, 이 때 bind() 연산자를 사용하여 쉽게 바인딩이 가능하다.
Observable
.combineLatest(firstName.rx.text, lastName.rx.text) { $0 + " " $1 }
.map { "Greetings, \(#0)" }
.bind(to: greetingLabel.rx.text)
.disposed(by: DisposeBag)
iOS 개발 시 작성하게 되는 코드의 대부분은 다양한 이벤트 처리와 관련된다.
ex) 사용자의 UI 컴포넌트 조작 시 @IBAction handler, 키보드 위치 변경을 감지하기 위한 notification 관찰, URLSession이 데이터로 응답할 때 실행할 클로저, KVO를 사용해서 변수의 변경사항을 감지 등…
일반적으로 대부분의 클래스들은 비동기적으로 작업을 수행하고, 모든 UI 요소들은 본질적으로 비동기적으로 동작함. 따라서 앱 코드를 작성했을 때 정확히 어떤 순서로 작동하는지 가정하는 것이 불가능하다.
👉 결국 앱의 코드는 사용자 입력, 네트워크 활동 또는 기타 OS 이벤트와 같은 다양한 외부 요인에 따라 완전히 다른 순서로 실행될 수 있다.
Swift에서 비동기 처리를 위해 제공되는 다양한 API들이 있지만 이를 통한 복합적인 비동기 코드는 개발자가 추적하는데 있어서 어려움이 존재한다.
“각각 다른 이벤트들을 처리하는 일관된 시스템이 하나 있으면 좋지 않을까” 하는 생각에 등장한 것이 👉 *RxSwift*
RxSwift는 본질적으로 코드가 ‘새로운 데이터에 반응’하고 ‘순차적으로 분리된 방식’으로 처리함으로써 비동기식 프로그램 개발을 간소화시켜줌