RxSwift는 Swift 언어에서 ReactiveX를 구현한 라이브러리로, 비동기 프로그래밍과 옵저버 패턴을 간단하고 효율적으로 처리할 수 있도록 돕습니다. ReactiveX의 철학은 데이터의 변화를 스트림으로 처리하는 방식으로, 이를 통해 이벤트 기반 프로그래밍을 손쉽게 구현할 수 있습니다.
네트워크 요청, 사용자 인터페이스 이벤트 처리 등 다양한 비동기 작업을 간결하게 구현.
코드가 체계적으로 정리되며, 유지보수가 용이.
복잡한 비동기 로직을 간단한 연산자(Operators)로 처리 가능.
ReactiveX를 기반으로 하기 때문에 RxJava, RxJS 등 다른 언어와 개념적으로 일치.
플랫폼 간 협업 및 통합 로직 설계가 용이.
이미 많은 기업에서 RxSwift를 사용 중.
특히 ReactorKit, RIBs 같은 아키텍처에서 필수적.
Observable: 데이터를 방출하는 스트림.
Observer: Observable을 구독(Subscribe)하여 데이터를 처리하는 객체.
let observable = Observable.just("RxSwift")
observable.subscribe(onNext: { print($0) })
상태
onNext: 정상 데이터 방출.
onError: 에러 방출.
onCompleted: 완료 이벤트 방출.
Single: 하나의 값만 방출 후 종료.
Maybe: 값 방출 없이 완료되거나 값을 방출하고 종료.
Completable: 값 없이 완료 상태만 방출.
Subject: Observable과 Observer 역할을 동시에 수행.
BehaviorSubject: 초기값 제공, 최근 값부터 구독.
PublishSubject: 초기값 없이 구독 후 방출된 값만 수신.
Relay: 에러나 완료 없이 지속적인 데이터 방출.
RxSwift에서 스레드를 관리하는 도구.
MainScheduler: UI 업데이트.
ConcurrentDispatchQueueScheduler: 비동기 작업.
SerialDispatchQueueScheduler: 직렬 작업.
데이터 변환.
Observable.of(1, 2, 3)
.map { $0 * 10 }
.subscribe(onNext: { print($0) })
여러 스트림의 데이터를 결합.
Observable.zip(
Observable.of(1, 2, 3),
Observable.of("A", "B", "C")
).subscribe(onNext: { print("\($0.0), \($0.1)") })
여러 스트림을 하나로 병합.
Observable.merge(
Observable.of("A1", "A2"),
Observable.of("B1", "B2")
).subscribe(onNext: { print($0) })
스트림을 변환해 또 다른 스트림을 반환.
Observable.of(1, 2, 3)
.flatMap { Observable.just("\($0)번 값") }
.subscribe(onNext: { print($0) })
이벤트 발생 빈도를 제한.
button.rx.tap
.throttle(.seconds(2), scheduler: MainScheduler.instance)
.subscribe(onNext: { print("Button tapped!") })
RxCocoa는 RxSwift의 확장 라이브러리로, UIKit과의 연동을 돕습니다. UI 이벤트를 RxSwift로 처리하면 코드가 간결하고 직관적으로 변합니다.
버튼 클릭 이벤트 처리:
button.rx.tap
.subscribe(onNext: { print("Button tapped!") })
.disposed(by: disposeBag)
요구사항:
버튼 클릭 시 서버 요청.
응답에 따라 UI 업데이트.
중복 클릭 방지.
button.rx.tap
.throttle(.seconds(2), scheduler: MainScheduler.instance)
.map { Int.random(in: 1...10).isMultiple(of: 2) }
.subscribe(onNext: { isEven in
button.backgroundColor = isEven ? .green : .red
}).disposed(by: disposeBag)
비동기 프로그래밍을 단순화:
RxSwift를 통해 복잡한 비동기 코드를 단순하게 표현.
실무 활용 가능성:
많은 기업에서 사용하는 만큼 학습 가치가 높음.
ReactiveX 철학 이해:
데이터와 이벤트의 흐름을 제어하는 방식에 대한 깊은 통찰 제공.