Fixing the scan duplicates #127

This commit is contained in:
Yannick Loriot 2017-11-28 22:50:44 +01:00
parent 7143dc37b7
commit 38e0be6b72
2 changed files with 19 additions and 13 deletions

View File

@ -38,6 +38,8 @@ class ViewController: UIViewController, QRCodeReaderViewControllerDelegate {
let builder = QRCodeReaderViewControllerBuilder { let builder = QRCodeReaderViewControllerBuilder {
$0.reader = QRCodeReader(metadataObjectTypes: [.qr], captureDevicePosition: .back) $0.reader = QRCodeReader(metadataObjectTypes: [.qr], captureDevicePosition: .back)
$0.showTorchButton = true $0.showTorchButton = true
$0.reader.stopScanningWhenCodeIsFound = false
} }
return QRCodeReaderViewController(builder: builder) return QRCodeReaderViewController(builder: builder)

View File

@ -361,25 +361,29 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
// MARK: - AVCaptureMetadataOutputObjects Delegate Methods // MARK: - AVCaptureMetadataOutputObjects Delegate Methods
public func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { public func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
sessionQueue.async { [weak self] in
guard let weakSelf = self else { return }
for current in metadataObjects { for current in metadataObjects {
if let _readableCodeObject = current as? AVMetadataMachineReadableCodeObject { if let _readableCodeObject = current as? AVMetadataMachineReadableCodeObject {
if _readableCodeObject.stringValue != nil { if _readableCodeObject.stringValue != nil {
if metadataObjectTypes.contains(_readableCodeObject.type) { if weakSelf.metadataObjectTypes.contains(_readableCodeObject.type) {
if let sVal = _readableCodeObject.stringValue { guard weakSelf.session.isRunning, let sVal = _readableCodeObject.stringValue else { return }
if stopScanningWhenCodeIsFound {
stopScanning() if weakSelf.stopScanningWhenCodeIsFound {
weakSelf.session.stopRunning()
} }
let scannedResult = QRCodeReaderResult(value: sVal, metadataType:_readableCodeObject.type.rawValue) let scannedResult = QRCodeReaderResult(value: sVal, metadataType:_readableCodeObject.type.rawValue)
DispatchQueue.main.async(execute: { [weak self] in DispatchQueue.main.async {
self?.didFindCode?(scannedResult) weakSelf.didFindCode?(scannedResult)
}) }
} }
} }
} }
else { else {
didFailDecoding?() weakSelf.didFailDecoding?()
} }
} }
} }