안녕하세요 녕입니다... 🍋
이번에는 RxSwift에 대해서 공부를 해보려고 합니다. 그동안 RxSwift 공부를 책만 보다 보니 집중이 안되더라고요. 역시 이럴 때는 블로그 작성하는 게 낫더라고요. 한번 열심히 해보겠습니다. 여러분들께도 도움이 되었으면 좋겠네요. Rx는 사실 처음에는 뭐라는 거야 싶을 수 있는데 코드를 볼수록 단순하고 제법 이해가 되더라고요. 개념은 확실하게 가는 게 좋겠죠. 화이팅해봅시다.
책은 ⌜Reactive_Programming_with_Swift_v4.0.0⌟을 보고 공부했습니다. 옛날 책이라 그런지 좀 이상한 부분도 있더라고요(?) 큼큼 추가적으로 이해가 안 가는 부분은 구글링 했습니다^p^
RxSwift란?
: observable sequence와 operator를 사용해서 비동기 코드와 이벤트 기반 코드를 구성하는 데 사용되는 라이브러리
비동기 프로그래밍은 언제 사용될까?
- 버튼 탭
- 텍스트필드
- 네트워킹
- 디스크에 데이터 저장
- 오디오 플레이
이런 작업들은 동시에 실행되는 것처럼 보인다. 그러나 비동기적으로 실행된다.
이런 애들을 RxSwift 라이브러리를 사용해서 이벤트를 받고 이에 대한 작업을 진행하면 굉장히 편리하다.
다른 비동기 API는?
- NotificationCenter: 이벤트 발생 시 코드 실행. (디바이스 방향 변경, 키보드 표출/미표출)
- Delegate Pattern: 객체 행동 정의
- Grand Central Dispatch(GCD): 코드 블락을 연속적/동시/딜레이를 준 뒤에 실행되도록 스케줄링 가능
- Closure → CallBack: 코드에서 전달할 수 있는 closure
- Combine: 리액티브 비동기 코드
[주의] Delegate 나 NotificationCenter를 사용하면 주어진 시간 내에 앱의 상태를 일관성 있게 유지하기 어렵다
RxSwift 맛보기 👅
Observables
: Element 타입 데이터의 변하지 않는 snapshot을 운반시킬 수 있는 일련의 이벤트를 비동기적으로 생성할 수 있는 기능
쉽게 말해서 아래와 같이 이해하면 될 거 같다:
- 어떤 value 혹은 이벤트를 비동기적으로 생성할 수 있는 기능
- 사용자가 시간이 지남에 따라 어떤 객체가 발생시키는 이벤트 또는 value를 구독(subscribe)할 수 있게 하는 기능
Observable class는 여러 observer가 아래의 일을 하게 하도록 한다.
- 실시간 이벤트 반응
- UI 업데이트
- 신규 데이터 처리 및 활용
Observable은 세 가지 타입의 이벤트를 받는다.
- next이벤트가 종료될 때까지 value를 무한히 내보낼 수 있다
- 최근 혹은 다음 value를 가지고 오는 이벤트
- completed
- event 시퀀스를 성공적으로 종료시킨다. 더 이상 value를 내보내지 않는다
- error
- 에러와 함께 시퀀스 종료. 추가적인 이벤트를 내보내지 않는
예를 들어) 인터넷에서 파일을 다운로드하는 경우
- 다운로드 시작 후, 들어오는 데이터 관찰
- 파일 일부 도착하면 데이터 덩어리를 반복적으로 받음 (next)
- 네트워크 연결이 중단되면 다운로드 멈추고 연결 시간 초과로 에러 발생 (error)
- 파일의 모든 데이터 다운로드 후 성공적으로 완료 (completed)
API.download(file: "https://...")
.subscribe(
onNext: { data in
// append data to temporary file
},
onError: { error in
// display error to user
},
onCompleted: {
// use downloaded file
}
)
여기서 API.download는 Observable<Data> 객체를 반환한다.
Schedulers
: DispatchQueue 또는 OperationQueue의 Rx에 해당하는 것으로, 훨씬 사용하기 쉽다
여러 경우에 따라 최상의 성능을 달성하기 위해 동일한 subscription의 작업을 다른 스케줄러에 예약!
- network subscription
- fetchJSON >> Custom
- process JSON >> Background
- display to UI >> Main Thread
- data bindings
- data update >> Background
- display to UI >> Main Thread
- UI events
- UI event handling / UI update >> Main Thread
각 구독은 스케줄러 사이에서 Dispatch 역할을 수행해서 작업 조각들을 올바른 context로 전송해서 서로의 출력을 원활하게 할 수 있도록 한다!
간단하게 RxSwift를 소개해봤다. 사실 개인적으로 Observable, Scheduler 도 중요하지만 여기선 말하지 않았지만 뒤에 나올 Subject, Relay, Driver 등이 조금 헷갈리는 개념이기 때문에 거기서 힘쓰는 게 좋다. Observable은 처음에는 뭐라는 거지 싶은데 보다 보면 이해가 간다. 화이팅 해보자… ( ・∇・)~