RxSwift에서 Driver란 무엇일까

RxSwift를 활용해 런닝 정보를 실시간으로 받아 기록을 측정할 수 있고 그 기록을 공유할 수 있는 앱을 만들어보고 있다 🙂 그 과정에서 Driver라는 오퍼레이터를 사용하게 되는데 오늘은 이 Driver에 대해서 알아보려고 한다!

 

Driver는 UI에 특화된 Observable로 메인스케줄러에서 사용되며 UI와 관련된 데이터 스트림을 처리하는데 사용되는 특수한 형태의 Observable이다.

 

주로 UI바인딩에 사용되고 UI 업데이트를 안전하게 처리하는데 중요한 역할을 담당하고 있다.

 

그 중 Observable이 있는데 Driver를 사용하는 이유는 뭘까 바로바로 Observable 특성을 그대로 가져오면서도 몇가지 추가적인 기능을 제공하기 때문이다.

 

몇가지 추가기능에 대해서 살펴보면

  1. Main Thread에서 동작한다.
    Driver는 항상 메인스레드에서 동작한다. 이는 UI업데이트가 메인 스레드에서 이루어져야하는 iOS 특정상 아주 중요한 역할이다. 메인스레드에서 동작하도록 구현해주기 때문에 UI와 관련된 작업이 메인스레드에서 안전하게 수행될 수 있도록 보장하는 특징이 있다.

  2. Hot Observable
    Driver는 Hot Observable로 동작한다. 이 뜻은 Driver가 구독되기 전에 이미 이벤트를 방출하기 시작하고 여러 구독자가 동일한 상태를 공유할 수 있음을 의미한다.

  3. Error Handling
    Driver는 에러가 발생하지 않는다는 특징이 있다. Driver 시퀀스는 에러를 방출하는 대신, 자동으로 해당하는 시퀀스를 종료하고 UI가 끊기지 않도록 한다. UI와 바인딩에서 에러로 인해 앱이 중단되는 것을 방지할 수 있다.

  4. 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에 대해서 자세하게 알아보는 시간을 가져야지ㅎㅎ

 

오늘은 여기까지!