Observable 시퀀스를 대상 속성 또는 UI 요소로 전달하는 객체

내부 구조
/**
Observer that enforces interface binding rules:
* can't bind errors (in debug builds binding of errors causes `fatalError` in release builds errors are being logged)
* ensures binding is performed on a specific scheduler
`Binder` doesn't retain target and in case target is released, element isn't bound.
By default it binds elements on main scheduler.
*/
public struct Binder<Value>: ObserverType {
public typealias Element = Value
private let binding: (Event<Value>) -> Void
/// Initializes `Binder`
///
/// - parameter target: Target object.
/// - parameter scheduler: Scheduler used to bind the events.
/// - parameter binding: Binding logic.
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
}
}
}
/// Binds next element to owner view as described in `binding`.
public func on(_ event: Event<Value>) {
self.binding(event)
}
/// Erases type of observer.
///
/// - returns: type erased observer.
public func asObserver() -> AnyObserver<Value> {
AnyObserver(eventHandler: self.on)
}
}
init(_ target:, binding:), binding: (Event<Value>) -> Void이 핵심target: 수신 객체(시퀀스의 값을 수신하는 객체)binding: target, 수신 받는 값 Value를 인자로하는 클로저 주입사용법
extension Reactive where Base: FileFormatChangeButton {
var title: Binder<String> {
return Binder(base.formatLabel) { label, text in
label.text = text
}
}
}