RxSwift/RxCocoa
[RxCocoa] 5. Traits (ControlProperty, ControlEvent, Driver)
jake-kim
2020. 9. 30. 23:07
Traits란?
- UI처리에 특화된 Observable (MainThread에서 실행, Error이벤트가 없음)
- Traits를 구독하는 모든 구독자는 동일한 시퀀스를 공유 (share연산자가 내부적으로 사용된 상태)

Control Property
- Traits중에 가장 기본형 (Main스케줄러, error이벤트를 발생하지 않음, 동일한 시퀀스 공유)
- rx네임 스페이스와 함께 사용: textField.rx.text.orEmpty

Control Event
- event를 Observable로 래핑한 속성 (여기서의 event는 버튼을 tap하는 등의 이벤트를 얘기)
- Observable의 역할은 수행하짐나, ControlProperty와는 다르게 Observer의 역할은 수행하지 못함
- control이 해제될 경우 Complete이벤트 방출

// UIButton+Rx.swift
extension Reactive where Base: UIButton {
/// Reactive wrapper for `TouchUpInside` control event.
public var tap: ControlEvent<Void> {
return controlEvent(.touchUpInside)
}
}
Driver
평범한 Observable을 Driver로 바꾸어서 사용 가능(MainThread, error x, share 속성으로 변경) : asDriver(...)
- asDriver(onErrorDriverWith:): error를 수동적으로 리턴하여, error에 이벤트를 handle할 수 있음
- asDriver(onErrorRecover:): driver에 사용되며 error에 대한 이벤트를 handle할 수 있음
Binder
- 데이터 바인딩을 위한 타입
- Main 스케줄러에서 binding
- error는 binding불가
extension Reactive where Base: LoginVC {
var keyboardHeightChanged: Binder<CGFloat> {
return Binder(base) { vc, height in
UIView.animate(withDuration: 0.2, animations: {
let safeAreaBottomLength = vc.view.safeAreaInsets.bottom
vc.btnVerifyBottomConstraint.constant = height - safeAreaBottomLength + Constants.ComponentStyle.intervalSizeBetweenButtonAndKeyboard
vc.view.layoutIfNeeded()
})
}
}
}