Tunko Development Diary

RxSwift) RxCocoa Traits(Driver) 본문

Development/RxSwift

RxSwift) RxCocoa Traits(Driver)

Tunko 2022. 6. 13. 20:23

Driver

Traits 에서 가장 핵심적인 Driver입니다.

Driver는 share() 연산자를 사용한것 처럼 하나의 시퀀스에서 동작하는 옵저버블이며 Error를 방출하지 않습니다.

Driver를 사용하기 위해선 기존 옵저버블에 asDriver() 연산자를 추가

기존 UI와 연동중이던 bind(to:) 를 .drive로 대체합니다.

예제)

import UIKit
import RxSwift
import RxCocoa

enum ValidationError: Error {
    case notANumber
}

class DriverViewController: UIViewController {
    
    let bag = DisposeBag()
    
    @IBOutlet weak var inputField: UITextField!
    @IBOutlet weak var resultLabel: UILabel!
    @IBOutlet weak var sendButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let result = inputField.rx.text
            .flatMapLatest {        // flatMapLatest 마지막으로 추가된 시퀀스의 옵저버블을 넘겨줌
                validateText($0)    // 문자열 체크결과 Bool
                    .observe(on: MainScheduler.instance) // flatMapLastest의 inner 옵저버블이 백그라운드에서 동작할때를 대비해서 메인스케쥴러에서 동작 하도록 강제
                    .catchErrorJustReturn(false)    // chtchErrorJuntReturn 을 통해 에러가 발생하면 false 리턴
            }
            .share()
        
        result
            .map { $0 ? "Ok" : "Error" }
            .bind(to: resultLabel.rx.text)
            .disposed(by: bag)
        
        result
            .map { $0 ? UIColor.blue : UIColor.red }
            .bind(to: resultLabel.rx.backgroundColor)
            .disposed(by: bag)
        
        result
            .bind(to: sendButton.rx.isEnabled)
            .disposed(by: bag)
        
    }
}

Driver 적용

override func viewDidLoad() {
        super.viewDidLoad()     
        let result = inputField.rx.text
            .asDriver()
            .flatMapLatest {        
                validateText($0)    
                    .asDriver(onErrorJustReturn: false)
            } 
        
        result
            .map { $0 ? "Ok" : "Error" }
            .drive(resultLabel.rx.text)
            .disposed(by: bag)
        
        result
            .map { $0 ? UIColor.blue : UIColor.red }
            .drive(resultLabel.rx.backgroundColor)
            .disposed(by: bag)
        
        result
            .drive(sendButton.rx.isEnabled)
            .disposed(by: bag)
        
    }

차이점은 asDriver() 를 적용하고

bind(to:) → drive() 로 변경했습니다.

하지만 .observe(on: MainScheduler.instance) UI에 적용될때 필요한 메인스케줄러 설정과

.catchErrorJustReturn(false) 에러 이벤트가 발생했을때에 대한 처리또한 .asDriver(onErrorJustReturn:) 통해 함께 가능해집니다.

반응형

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

RxSwift) RxCocoa - UICollectionView  (0) 2022.06.15
RxSwift) RxCocoa - TableView  (0) 2022.06.14
RxSwift) RxCocoa Binding  (0) 2022.06.12
RxSwift) RxCocoa 란?  (0) 2022.06.12
RxSwift) Error Handling (retry, retry(when:))  (0) 2022.06.10
Comments