이번에 MVVM을 공부하며 그리고 이전에 Swift로 앱 개발을 할 때도 많이 들었던 RxSwift! 그래서 RxSwift는 무엇일까요?
RxSwift를 알기 이전에 Swift 앞에 붙는 Rx가 무엇인지 알아야 합니다.
Rx는 ReactiveX의 줄임말입니다.
ReactiveX는 관찰 가능한 시퀀스를 사용하여 비동기 및 이벤트 기반 프로그램을 구성하기 위한 라이브러리입니다.
즉 RxSwift는 Swift로 비동기 및 이벤트 기반 프로그래밍을 쉽게 해주기 위한 라이브러리입니다.
우린 지금까지 Apple에서 제공해 주는 여러 가지 방법으로 비동기 처리를 해왔습니다.
하지만 이런 여러 API들로 복합적인 비동기 코드를 나누어 처리하고, 어떤 코드가 언제 실행되는지 알 수 없기 때문에 외부요인에 따라 실행되는 순서가 생각했던 것과는 다르게 실행될 수도 있습니다.
그래서 여러 API를 복합적으로 사용하는 것이 아닌 RxSwift를 사용하여 비동기 처리를 보다 쉽게 해줄 수 있습니다.
Observable은 관찰 가능한이라는 뜻을 가지고 있습니다.
RxSwift에서는 Observer가 Observable을 구독하고 관찰 가능한 항목에 반응을 합니다.
Observable은 다음 3가지 이벤트를 방출합니다.
Error, Complete가 호출되면 Dispose가 호출되어 스트림이 종료됩니다.
구독의 생명 주기 마지막엔 항상 Dispose가 호출됩니다.
postObservable = Observable<String>.create { observer in
// "A"라는 항목을 배출
observer.onNext("A")
observer.onCompleted()
//Completed된다면 Disposable 리턴
return Disposables.create()
}
postObservable
// postObservable를 구독
.subscribe( event in
// event 별로 나누어 처리
switch event {
.next(let val):
print(val)
.error(let err):
print(err)
.completed:
print("Completed")
}
onDisposed: { print("Disposed") }
).disposed(by: disposeBag)
// "A"
// Completed
// Disposed
위 코드는 문자 "A"를 데이터로 전달하는 postObservable를 생성하고, postObservable를 구독하여 데이터를 받고 처리하는 코드입니다.
성공했을 때는 "A"(데이터), Completed, Disposed가 출력되고 error 발생 시에는 error와 Disposed가 출력됩니다.
Operator는 말 그래도 Observable의 생성, 병합 등 여러 가지 연산을 도와주는 연산자입니다.
가장 기본적인 just, map, filter에 대해 설명하겠습니다.
Observable의 불필요한 과정 없이 데이터에 대한 Observable을 생성하고 구독할 수 있습니다.
Observable.just("Hello World")
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// "Hello World"
배열 내에 값을 순차적으로 배출합니다.
Observable.from(["Hello", "World", "Rxswift"])
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// "Hello"
// "World"
// "Rxswift"
map은 익숙한 함수이죠?
데이터를 조건에 따라 변환하는 연산자입니다.
Observable.just("Hello")
.map { "\($0) World" }
.subscribe(onNext: { str in
print($0)
})
.disposed(by: disposeBag)
// "Hellow World"
데이터를 조건에 따라 걸러주는 연산자입니다.
Observable.from([1, 3, 5, 7])
.filter { $0 >= 5 }
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// 5
// 7
ReactiveX에서 더 많은 연산자를 확인할 수 있습니다.
Scheduler는 Observable 또는 연산자가 특정 스케줄러에서 작동하도록 지시할 수 있습니다.
우리가 기존에 사용하던 DispatchQueue와 같은 개념이지만, 실제 사용은 훨씬 간편합니다.
Observable.just("5")
// 병렬비동기 스레드의 스케줄러
.observeOn(ConcurrentDispatchQueueScheduler(qos: .default))
// "12.7"
.map { "\(Double($0)!*Double(2.54))" }
// "12.7cm"
.map { "\($0)cm" }
// View 관련 코드는 메인 스레드에서 실행
.observeOn(MainScheduler.instance)
.subscribe(onNext: {
self.label.text = $0
})
.disposed(by: disposeBag)
프로젝트를 진행 중에 RxSwift에 적응하기 어려워, 내용을 정리하면 좀 편할까라는 마음으로 간단히 RxSwift에 기본적인 내용에 대해 정리해 봤습니다.
RxSwift에 대해 새롭게 공부하거나 정리가 필요하다고 느끼는 것들을 지속적으로 정리하여 포스팅하겠습니다.