안녕하세요🐶
빈지식 채우기의 비니🙋🏻♂입니다.
이번 포스팅에서는 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 |