본문 바로가기
iOS📱/RxSwift

[RxCocoa] Driver

by 텅빈비니 2024. 1. 17.
반응형

안녕하세요🐶

빈지식 채우기의 비니🙋🏻‍♂입니다.

 

이번 포스팅에서는 Observable에서 파생된 Driver라는 개념에 대해 알아보도록 하겠습니다.


1. Driver

Driver는 기본적으로 Observable에서 파생

 

Driver은 Main Thread에서 작업하고 싶을 때 Observable 대신 사용할 수 있습니다.

.

.

즉! UI 작업에 적합하다~

.

.

Observable 의 경우,

기본적으로 Background Thread에서 작업하므로 Main Thread에서 작업을 하기 위해서는 별도의 명시가 지정해줘야 하지만

Driver는 그러지않아 보다 편리하게 사용할 수 있습니다.

.

Driver로 변환하고 싶을 때 asDriver() 을 사용하면 된다.

1. asDriver 의 경우 asObservable을 통해 Driver은 Observable에서 파생된 것임을 알 수 있다.

2. DriverSharingStrategy를 들어가보면 MainScheduler 를 통해 Driver는 Main Thead에서 동작한다는 것을 알 수 있다.


2. Driver vs Observable

UI에서 Driver 과 Observable 사용 예시를 보며 확인해보도록 하겠습니다.

 

2-1. Observable

간단하게 ID 와 PW가 입력되어있는지 확인하고 로그인 버튼을 활성화하는 기능으로 만들었습니다.

let idValid = id.rx.text
    .asObservable()
    .observe(on: MainScheduler.instance)	// Main Thead 설정
    .share(replay: 1)	// 하나의 시퀀스 공유 ( 버퍼 1 )
    .map {
        ($0?.count) ?? 0 > 0
    }

let pwValid = pw.rx.text
    .asObservable()
    .observe(on: MainScheduler.instance)	// Main Thead 설정
    .share(replay: 1)	// 하나의 시퀀스 공유 ( 버퍼 1 )
    .map {
        ($0?.count) ?? 0 > 0
    }

let valid = Observable.combineLatest(idValid, pwValid) { $0 && $1 }
.observe(on: MainScheduler.instance)	// Main Thead 설정

valid.subscribe { valid in
    self.loginBtn.isEnabled = valid
}.disposed(by: disposeBag)

1. ID 와 PW 의 TextField 를 Observable 로 설정한다.

2. ID 와 PW 를 CombineLatest 를 통해 두개의 결과를 AND 연산을 한다.

3. AND 연산을 통해 나온 결과를 버튼 활성화 여부에 사용한다.

 

 

2-2. Driver

다음은 위의 내용에서의 Observable을 Driver로 바꾸어 사용했을 때의 소스입니다.

 let idValidDriver = id.rx.text
    .asDriver()					// Driver 로 설정
    .map {
        ($0?.count) ?? 0 > 0
    }

let pwValidDriver = pw.rx.text
    .asDriver()					// Driver 로 설정
    .map {
        ($0?.count) ?? 0 > 0
    }

let validDriver: Driver<Bool> = Driver.combineLatest(idValidDriver, pwValidDriver) { id, pw in
    id && pw
}
validDriver.drive { valid in
    self.loginBtn.isEnabled = valid
}.disposed(by: disposeBag)

- Observable 과는 다르게 Main Thead 설정과 Share 설정을 하지 않아도 된다.


3. 정리

UI 관련된 작업을 할 때,
Observable 대신 Driver을 사용하자

이상으로 Driver 포스팅을 마치겠습니다.

전체 소스는 아래와 같이 첨부하도록 하겠습니다.

더보기

import Foundation

import RxSwift

import RxCocoa

 

class DriverTest {

    

    let id = UITextField()

    let pw = UITextField()

    let loginBtn = UIButton()

    

    func driverTest() {

        

        let disposeBag = DisposeBag()

        

        print("----------------------------------------------------------")

        

        let idValid = id.rx.text

            .asObservable()

            .observe(on: MainScheduler.instance)

            .share(replay: 1)

            .map {

                ($0?.count) ?? 0 > 0

            }

        

        let pwValid = pw.rx.text

            .asObservable()

            .observe(on: MainScheduler.instance)

            .share(replay: 1)

            .map {

                ($0?.count) ?? 0 > 0

            }

        

        let valid = Observable.combineLatest(idValid, pwValid) { $0 && $1 }.observe(on: MainScheduler.instance)

        valid.subscribe { valid in

            self.loginBtn.isEnabled = valid

        }.disposed(by: disposeBag)

        

        print("----------------------------------------------------------")

        

        let idValidDriver = id.rx.text

            .asDriver()

            .map {

                ($0?.count) ?? 0 > 0

            }

        

        let pwValidDriver = pw.rx.text

            .asDriver()

            .map {

                ($0?.count) ?? 0 > 0

            }

        

        let validDriver: Driver<Bool> = Driver.combineLatest(idValidDriver, pwValidDriver) { id, pw in

            id && pw

        }

        validDriver.drive { valid in

            self.loginBtn.isEnabled = valid

        }.disposed(by: disposeBag)

     

        print("----------------------------------------------------------")

        

    }

    

}

다음 포스팅은 Debounce 와 Throttle 에 대해 알아보도록 하겠습니다.

감사합니다~~


참고

반응형

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

[RxSwift] Traits ( Single, Maybe, Completable )  (0) 2024.01.18
[RxSwift] Debounce, Throttle  (0) 2024.01.17
[RxCocoa] Relay  (2) 2024.01.16
[ RXSwift ] Subject  (2) 2024.01.15
[ RxSwift ] Operator  (0) 2024.01.11