RxSwift를 활용해 런닝 정보를 실시간으로 받아 기록을 측정할 수 있고 그 기록을 공유할 수 있는 앱을 만들어보고 있다 🙂 그 과정에서 Driver라는 오퍼레이터를 사용하게 되는데 오늘은 이 Driver에 대해서 알아보려고 한다!
Driver는 UI에 특화된 Observable로 메인스케줄러에서 사용되며 UI와 관련된 데이터 스트림을 처리하는데 사용되는 특수한 형태의 Observable이다.
주로 UI바인딩에 사용되고 UI 업데이트를 안전하게 처리하는데 중요한 역할을 담당하고 있다.
그 중 Observable이 있는데 Driver를 사용하는 이유는 뭘까 바로바로 Observable 특성을 그대로 가져오면서도 몇가지 추가적인 기능을 제공하기 때문이다.
몇가지 추가기능에 대해서 살펴보면
- Main Thread에서 동작한다.
Driver는 항상 메인스레드에서 동작한다. 이는 UI업데이트가 메인 스레드에서 이루어져야하는 iOS 특정상 아주 중요한 역할이다. 메인스레드에서 동작하도록 구현해주기 때문에 UI와 관련된 작업이 메인스레드에서 안전하게 수행될 수 있도록 보장하는 특징이 있다. - Hot Observable
Driver는 Hot Observable로 동작한다. 이 뜻은 Driver가 구독되기 전에 이미 이벤트를 방출하기 시작하고 여러 구독자가 동일한 상태를 공유할 수 있음을 의미한다. - Error Handling
Driver는 에러가 발생하지 않는다는 특징이 있다. Driver 시퀀스는 에러를 방출하는 대신, 자동으로 해당하는 시퀀스를 종료하고 UI가 끊기지 않도록 한다. UI와 바인딩에서 에러로 인해 앱이 중단되는 것을 방지할 수 있다. - UI State Consistency
Driver는 구독자가 새로운 값을 받을 때 마다 최신 상태를 제공한다. 이는 UI 상태가 항상 최신 값으로 업데이트 되도록 보장한다.
특징을 알아봤으니 이제 내가 Driver를 어떻게 사용했는지 살펴보면
viewModel.distance
.drive(distanceLabel.rx.text)
.disposed(by: disposeBag)
viewModel.duration
.drive(timeLabel.rx.text)
.disposed(by: disposeBag)
distance는 사용자가 이동한 거리 정보를 UI에 업데이트 하는데 사용된다 UI에 즉시 반영되도록 했고 그러기 위해서 Driver를 사용해 항상 메인스레드에서 안전하게 이뤄지도록 구현했다.
또한 거리 계산 중 에러가 발생해도 UI 바인딩이 끊기지 않고 정상적으로 작동해야하기 때문에 Driver를 사용하게 되었다.
distance = runningManager.currentSession
.compactMap { $0?.distance }
.flatMap { $0.asObservable() }
.map { String(format: "%.2f km", $0) }
.asDriver(onErrorJustReturn: "0.00 km")
또한 여기서 확인되는 asDriver에 대해서 설명하자면 Observable은 기본적으로 에러가 발생하면 스트림이 종료되지만 UI와 연관된 작업에서 이렇게 종료 되어버리면 앱을 사용할 수 없어지기 때문에 asDriver(onErrorJustReturn:) 를 사용해 에러가 발생하여도 스트림이 종료되지 않고 지정된 기본 값을 방출하도록 설정하게 된 것 이다.
음 약간 옵셔널이랑 비슷한 느낌인 것 같다 안전하게 오류라면 지정한 값을 배출 할 수 있도록 하는 측면에서?
currentSession에서 distance 값을 옵셔널 바인딩을 통해 추출하고 compactMap을 사용해 nil을 거른뒤 distance가 있는 경우에 다음으로 넘어간다.
그 다음 Double 값을 String으로 변환한 뒤 이 문자열을 UI에 표시되도록 했다.
그 다음 에러가 발생한다면 위에서 설명했던 것 처럼 기본값을 방출하는 방식으로 거리를 UI에 업데이트하는 로직을 구현하게 되었다.
이렇게 UI를 업데이트 하는 측면에서 아주 편리하고 안전하게 Driver를 사용한 사례에 대해서 살펴보았다 🙂
RxSwift의 역할이 아주 무궁무진한 것 같아서 배우는 맛이있네.. 내일은 Relay에 대해서 자세하게 알아보는 시간을 가져야지ㅎㅎ
오늘은 여기까지!
'◽️ Programming > RxSwift' 카테고리의 다른 글
RxSwift에서 PublishRelay, BehaviorRelay를 왜 사용하는 걸까? (0) | 2024.08.28 |
---|---|
[RxSwift] 가장 기본적이고 중요한 Observable에 대해서 알아보자 (0) | 2024.08.20 |
RxSwift 사용해서 TableView, CollectionView 구현하기 (0) | 2024.07.29 |
API 네트워크 통신 과정을 통해 RxSwift 이해하기 (0) | 2024.07.28 |
[SwiftUI,RxSwift] 데이터 모델링, 메인 UI 그리기 , DisposeBag , onNext , onAppear (0) | 2024.07.05 |