4

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

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

也许这不是验证 QR 码的正确位置,或者不是进行 segue 的正确位置,但如果不是,我想知道应该在哪里进行验证和 segue。我唯一的其他要求是验证仅在检测到 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
        }
    }
}
4

1 回答 1

8

我在这个问题线程上联系了 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)
    })
}

为避免在扫描时多次转接,可以在for 循环中使用self.session.stopRunning()与 a 一起调用的调用。breakbarcodes

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
        }
    }
}
于 2015-07-20T16:51:13.177 回答