2015-07-20 4 views
4

Я создаю приложение, которое использует сканирование QR-кода с использованием RSBarcodes for Swift. То, что я пытаюсь сделать в своем ScanViewController, - это отсканировать QR-код, проверить, что было отсканировано, а затем отсканировать отсканированные данные. В настоящее время, когда QR-код обнаружен, мой замерзает UI, и вскоре после того, как я получаю ошибки и памяти дамп:Выполнение действия при сканировании штрих-кода с использованием RSBarcodes

«NSInternalInconsistencyException», причина: «Только бежать на главном потоке!».

Возможно, вы не можете быть здесь, чтобы проверить QR-код или не подходящее место для отдыха, но если нет, то мне интересно, где должна проходить валидация и 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 
     } 
    } 
} 

ответ

8

Я связался с разработчиком RSBarcodes_Swift на this issue нити. Чтобы выполнить любую операцию UI, ее необходимо запустить в основном потоке. Например, функция Segue должна быть изменена с:

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

к

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

Чтобы избежать segueing несколько раз во время сканирования, вызов self.session.stopRunning() вместе с break может быть использован в barcodes цикл ,

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 
     } 
    } 
} 
Смежные вопросы