study record

[RxSwift] Driver란? 본문

iOS/RxSwift

[RxSwift] Driver란?

asong 2022. 3. 29. 22:06

Driver

UI에 특화된 Observable로, MainScheduler에서 사용한다. 

error를 방출하지 않으며, Observable을 Wrapping한다.

Driver는 다른 구현체에는 존재하지 않고, UI에 사용하기 위해 RxCocoa에 도입된 Observable의 특수 케이스이다.

BehaviorRelay와 많은 공통점을 가지고 있으며, Observable을 UI 처리 목적으로 죽지 않는 스트림을 제공하기 위해 생성된 것이다.

 

- 절대 종료되지 않는다.

- 무조건 MainScheduler에서 돌아간다. 

- 구독 역시 MainScheduler에서 하는 것이 권장된다. 

 

구독 메서드 : drive()

구독 시 가장 최근 이벤트를 받는다.

 

언제 사용?

Main Thread를 사용하고자 할 때 .observeOn(MainScheduler.instance)로 접근하지 않고 asDriver().drive()를 통해 자동으로 메인 스레드 사용하고자 할 때.

Observable에서 error를 받지 않고 스트림을 유지하고자 할 때.

 

일반 Observable도 Driver로 변환할 수 있다.

// asDriver의 함수 정의 중 하나, Signal도 이와 비슷하다.
public func asDriver(onErrorJustReturn: Element) -> Driver<Element> {
	let source = self
 	.asObservable()
 	.observeOn(DriverSharingStrategy.scheduler) // MainScheduler를 나타낸다.
		.catchErrorJustReturn(onErrorJustReturn) // error나 completed가 된 경우 대신 내보낼 값. 
	return Driver(source)

 

textField.rx.text
	.asDriver()
    .drive(onNext: {
    	viewModel.passwordInput
        })
        .disposed(by: disposeBag)

asDriver() 메소드를 통해 Observable을 driver로 변경하여 사용하며,

driver로 변경 시, subscribe()가 아닌 drive() 메서드를 통해 스트림 이벤트를 처리한다.

driver는 MainScheduler에서 실행되므로 observeOn(MainScheduler.instance)와 같이 스레드를 전환해 줄 필요가 없다.

drive는 onError가 없다.

 

 

하나의 Relay에 여러 Driver를 생성해서 하나의 이벤트를 여러 곳에서 구독할 수 있다.

let behavior = BehaviorRelay<Int>(value: 0) 
let driver1 = behavior.asDriver() 
let driver2 = behavior.asDriver() 

driver1 
	.drive(onNext: { 
    	print("drive1: \($0)") 
     }) 
     .disposed(by: disposeBag) 
     
driver2 
	.drive(onNext: { 
    	print("drive2: \($0)") 
     }) 
     .disposed(by: disposeBag)

 

Observable, Observer, Subject, Relay, Driver 차이

Observable : 값을 방출, unicast

Observer : Observable을 관찰하고 반응

Subject : Observable + Observer, multicast

Relay : Subject를 Wrapping, error, complete가 없다.

Driver : Observable을 Wrapping, error가 없다. 구독만 가능하다. 메인 스레드로 전환하지 않아도 메인 스레드에서 실행된다.

 

 

참고:

https://baechukim.tistory.com/84

https://jcsoohwancho.github.io/2019-08-09-RxSwift%EA%B8%B0%EC%B4%88-Driver-&-Signal/

https://duwjdtn11.tistory.com/626

https://nsios.tistory.com/71

'iOS > RxSwift' 카테고리의 다른 글

[RxSwift] Observable이란?  (0) 2022.08.06
Reactive Programming이란?  (0) 2022.07.17
[RxSwift] Subject와 Relay  (0) 2022.03.14
[RxSwift] Subject의 종류  (0) 2022.03.11
[RxSwift] RxSwift 왜 사용하게 되었나? +(선언적 프로그래밍)  (0) 2022.03.07