Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save richieshilton/afad03a3f0a126749f7d7cf2348fb714 to your computer and use it in GitHub Desktop.
Save richieshilton/afad03a3f0a126749f7d7cf2348fb714 to your computer and use it in GitHub Desktop.
RxCaptureMetadataOutputObjectsDelegateProxy and Reactive extension to (_:didOutput:from:) method
import Foundation
import AVFoundation
import RxSwift
import RxCocoa
class RxCaptureMetadataOutputObjectsDelegateProxy:
DelegateProxy<AVCaptureMetadataOutput, AVCaptureMetadataOutputObjectsDelegate>,
DelegateProxyType,
AVCaptureMetadataOutputObjectsDelegate {
private(set) var metadataOutput: AVCaptureMetadataOutput?
public init(metadataOutput: AVCaptureMetadataOutput) {
self.metadataOutput = metadataOutput
super.init(parentObject: metadataOutput,
delegateProxy: RxCaptureMetadataOutputObjectsDelegateProxy.self)
}
static func registerKnownImplementations() {
self.register { RxCaptureMetadataOutputObjectsDelegateProxy(metadataOutput: $0) }
}
static func currentDelegate(for object: AVCaptureMetadataOutput) -> AVCaptureMetadataOutputObjectsDelegate? {
return object.metadataObjectsDelegate
}
static func setCurrentDelegate(_ delegate: AVCaptureMetadataOutputObjectsDelegate?, to object: AVCaptureMetadataOutput) {
object.setMetadataObjectsDelegate(delegate.map { $0 },
queue: DispatchQueue.main)
}
}
extension Reactive where Base: AVCaptureMetadataOutput {
public var delegate: DelegateProxy<AVCaptureMetadataOutput, AVCaptureMetadataOutputObjectsDelegate> {
return RxCaptureMetadataOutputObjectsDelegateProxy
.proxy(for: base)
}
public var didOutputMetadataObjects: Observable<([AnyObject], AVCaptureConnection)> {
return delegate
.methodInvoked(#selector(AVCaptureMetadataOutputObjectsDelegate.metadataOutput(_:didOutput:from:)))
.map { ($0[1] as! [AnyObject], $0[2] as! AVCaptureConnection) }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment