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

@ -36,8 +36,10 @@ class ViewController: UIViewController, QRCodeReaderViewControllerDelegate {
lazy var reader: QRCodeReader = QRCodeReader() lazy var reader: QRCodeReader = QRCodeReader()
lazy var readerVC: QRCodeReaderViewController = { lazy var readerVC: QRCodeReaderViewController = {
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

@ -156,7 +156,7 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
metadataOutput.setMetadataObjectsDelegate(self, queue: metadataObjectsQueue) metadataOutput.setMetadataObjectsDelegate(self, queue: metadataObjectsQueue)
let allTypes = Set(metadataOutput.availableMetadataObjectTypes) let allTypes = Set(metadataOutput.availableMetadataObjectTypes)
let filtered = metadataObjectTypes.filter { (mediaType) -> Bool in let filtered = metadataObjectTypes.filter { (mediaType) -> Bool in
allTypes.contains(mediaType) allTypes.contains(mediaType)
} }
metadataOutput.metadataObjectTypes = filtered metadataOutput.metadataObjectTypes = filtered
previewLayer.videoGravity = .resizeAspectFill previewLayer.videoGravity = .resizeAspectFill
@ -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) {
for current in metadataObjects { sessionQueue.async { [weak self] in
if let _readableCodeObject = current as? AVMetadataMachineReadableCodeObject { guard let weakSelf = self else { return }
if _readableCodeObject.stringValue != nil {
if metadataObjectTypes.contains(_readableCodeObject.type) { for current in metadataObjects {
if let sVal = _readableCodeObject.stringValue { if let _readableCodeObject = current as? AVMetadataMachineReadableCodeObject {
if stopScanningWhenCodeIsFound { if _readableCodeObject.stringValue != nil {
stopScanning() if weakSelf.metadataObjectTypes.contains(_readableCodeObject.type) {
guard weakSelf.session.isRunning, let sVal = _readableCodeObject.stringValue else { return }
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?()
} }
} }
} }