Files
OrderScheduling/Pods/RxSwift/RxSwift/Binder.swift
DDIsFriend f0e8a1709d initial
2023-08-18 17:28:57 +08:00

60 lines
1.8 KiB
Swift

//
// Binder.swift
// RxSwift
//
// Created by Krunoslav Zaher on 9/17/17.
// Copyright © 2017 Krunoslav Zaher. All rights reserved.
//
/**
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)
}
}