RxSwift는 데이터의 변화를 감지하고 반응하는 리액티브 프로그래밍(Reactive Programming)을 위한 Swift 라이브러리인데,
한마디로 이벤트가 발생할 때마다 자동으로 반응하는 프로그램을 쉽게 만들 수 있게 도와주는 라이브러리라고 보면 된다.
버스 정류장에서 버스를 기다린다고 상상해 보자.
RxSwift에서는 이 과정을 코드로 표현해주는 것과 같은데 데이터의 흐름을 마치 "버스를 기다리는 것처럼" 선언적으로 다룰 수가 있다.
기존 방식에서는 UI 업데이트, 비동기 작업(API 호출 등), 이벤트 처리 등을 코드로 모두 직접 연결해야 했는데, 이렇게 되면 코드가 길어지고 유지보수가 어려워진다고 한다.
RxSwift를 사용한다면,
Observable은 이벤트 스트림(데이터 흐름)을 나타내는데, 표현하자면 "변화를 관찰할 수 있는 데이터"라고 생각하면 된다.
let observable = Observable.of(1, 2, 3)
observable.subscribe { event in
print(event)
}
위 코드는 1
, 2
, 3
이라는 데이터 흐름을 출력한다.
Observer는 Observable을 구독(subscribe)해서 데이터가 바뀌면 반응하는 역할을 한다.
observable.subscribe(onNext: { value in
print("다음 값: \(value)")
})
연산자는 Observable의 데이터를 변형하거나 필터링을 한다.
let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.filter { $0 % 2 == 0 }
.map { $0 * 10 }
.subscribe(onNext: { print($0) })
결과 값은 20, 40
이 나온다.
RxCocoa는 UI 이벤트와 RxSwift를 연결하는 다리 역할을 하는데,
예를 들어 버튼 클릭 이벤트를 처리하려면
button.rx.tap
.subscribe(onNext: {
print("버튼이 클릭되었습니다!")
})
.disposed(by: disposeBag)
textField.rx.text.orEmpty
.map { $0.uppercased() }
.bind(to: label.rx.text)
.disposed(by: disposeBag)
입력된 텍스트가 실시간으로 대문자로 변환되어 라벨에 표시된다.
코드 동작을 요약하자면,
textField.rx.text.orEmpty
로 감지..map { $0.uppercased() }
.bind(to: label.rx.text)
.disposed(by: disposeBag)
BehaviorSubject: 가장 최근 값을 저장하고, 새로운 구독자가 구독하면 즉시 전달한다.
PublishSubject, ReplaySubject 등도 사용법을 익히는 것이 좋다고 한다. 하아...
map
, filter
, flatMap
, withLatestFrom
등의 주요 연산자를 공부해놓으면 좋다고한다.
특히 withLatestFrom의 경우 두 개의 스트림을 결합하는데 자주 사용되어서 이 연산자를 잘 이해하는게 포인트라고..
withLatestFrom
을 아주 쉽게 설명하자면 "버튼을 누를 때마다 최신 정보를 가져오는 도구"라고 한다.
사용자가 메시지를 입력하다가 보내기 버튼
을 누르면, 버튼을 누른 순간에 메시지 창에 적힌 최신 메시지가 전송되는 것이다.
let button = PublishSubject<Void>() // 버튼 클릭
let textField = BehaviorSubject<String>(value: "안녕") // 텍스트 입력값
button.withLatestFrom(textField)
.subscribe(onNext: { latestText in
print("버튼 클릭 후 가져온 텍스트: \(latestText)")
})
.disposed(by: disposeBag)
"안녕"
으로 시작할 것이고, "안녕하세요"
라고 입력했다고 하자."안녕하세요"
가 출력이 된다.솔직히 rxSwift 공부시작할 때 기존에 배웠던 swift 랑은 아예 다른 언어를 배운다는 느낌이 들어서 괜히 피하고 싶고 공부하기 제일 힘들었던 것 같다.
차근차근 공부해도 어려울 것 같은데 시간은 촉박하니 마음만 급해졌지만, 어쩌겠어 해야지.
네트워크 요청과 RxSwift를 결합하는 방법을 공부해서 간단한 RxSwift 기반의 프로젝트(검색 앱이나 To-Do 리스트 앱)를 만들어보는걸 시도해봐야겠다.