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:) 통해 함께 가능해집니다.
반응형