Binder
public init<Target: AnyObject>(_ target: Target, scheduler: ImmediateSchedulerType = MainScheduler(), binding: @escaping (Target, Value) -> Void) {
weak var weakTarget = target
self.binding = { event in
switch event {
case .next(let element):
_ = scheduler.schedule(element) { element in
if let target = weakTarget {
binding(target, element)
}
return Disposables.create()
}
case .error(let error):
rxFatalErrorInDebug("Binding error: \(error)")
case .completed:
break
}
}
}
- UIBinding에 사용하는 옵저버
- 초기화 시 UI객체를 전달
- 메인스케줄러 사용(UI관련이니까)
- 보통 클로저의 Value에 있는 값을 Target에 저장하는 방식으로 구현
custom extension
extension Reactive where Base: UILabel {
var segmentedValue: Binder<Int> {
return Binder(self.base) { label, index in
switch index {
case 0:
label.text = "Red"
label.textColor = .red
case 1:
label.text = "Green"
label.textColor = .green
case 2:
label.text = "Blue"
label.textColor = .blue
default:
label.text = "Unknown"
label.textColor = .black
}
}
}
}
colorPicker.rx.selectedSegmentIndex
.bind(to: valueLabel.rx.segmentedValue)
.disposed(by: bag)
- 동일하게 클로저의 value 값을 target에 저장하는 방식
- 메인스케줄러에서 실행됨이 보장되기 때문에 생략