반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- @Environment
- graphql
- nonisolated
- NavigationLink
- init
- nestjs
- SwiftUI
- SWIFT
- RFC1738/1808
- IOS
- vim
- @Binding
- ios14
- swift6
- Bug
- operator
- init?
- Creating Operators
- @EnvironmentObject
- typeorm
- Xcode
- NullObject
- RxCocoa
- subject
- URL(string:)
- RxSwift
- dismiss
- @State
- Operater
- Operators
Archives
- Today
- Total
Tunko Development Diary
RxSwift) RxCocoa Traits(Driver) 본문
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