【问题标题】:Perform Action When a Barcode Is Scanned Using RSBarcodes使用 RSBarcodes 扫描条码时执行操作
【发布时间】:2015-10-09 21:34:30
【问题描述】:

我正在使用RSBarcodes for Swift 构建一个利用二维码扫描的应用程序。我在ScanViewController 中尝试做的是扫描二维码,验证扫描的内容,然后使用扫描的数据进行搜索。目前,当检测到二维码时,我的 UI 会冻结,并且在我收到错误和内存转储后不久:

'NSInternalInconsistencyException',原因:'只在主线程上运行!'。

也许这不是验证 QR 码的正确位置,或者不是进行转场的正确位置,但如果不是,我想知道应该在哪里进行验证和转场。我唯一的其他要求是仅在检测到 QR 码时才进行验证。

class ScanViewController: RSCodeReaderViewController{
    // Class Variables
    var finalObject: IBuiltCode?
    let ObjectHelper = ObjectBuilder() // Service to validate and build valid scanned objects

    override func viewDidLoad() {
        super.viewDidLoad()

        self.focusMarkLayer.strokeColor = UIColor.redColor().CGColor
        self.cornersLayer.strokeColor = UIColor.yellowColor().CGColor

        self.tapHandler = { point in
            println(point)
        }

        self.barcodesHandler = { barcodes in
            for barcode in barcodes {
                println("Barcode found: type=" + barcode.type + " value=" + barcode.stringValue)
                if let builtObject = self.ObjectHelper.validateAndBuild(barcode,
                      scannedData: barcode.stringValue){
                    println("Good object.")
                    self.performQR()
                }
            }
        }
    }

    func performQR(){
        performSegueWithIdentifier("toQR", sender: self)
    }
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "toQR"){
            let QRVC: QRViewController = segue.destinationViewController as! QRViewController
            QRVC.receivedObject = finalObject as? QRObject
        }
    }
}

【问题讨论】:

    标签: ios swift rsbarcodes


    【解决方案1】:

    我在this issue 线程上联系了 RSBarcodes_Swift 的开发人员。为了执行任何 UI 操作,它需要在主线程上运行。比如segue函数需要改成:

    func performQR(){
            self.performSegueWithIdentifier("toQR", sender: self)
    }
    

    func performQR(){
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            self.performSegueWithIdentifier("toQR", sender: self)
        })
    }
    

    为避免在扫描时出现多次转接,可以在 barcodes for 循环中使用调用 self.session.stopRunning()break

    self.barcodesHandler = { barcodes in
        for barcode in barcodes {
            println("Barcode found: type=" + barcode.type + " value=" + barcode.stringValue)
            if let builtObject = self.ObjectHelper.validateAndBuild(barcode,
                  scannedData: barcode.stringValue){
                println("Good object.")
                self.finalObject = builtObject
                self.session.stopRunning() // Avoid scanning multiple times
                self.performQR()
                break
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-05
      • 2012-07-17
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-08
      相关资源
      最近更新 更多