2017-09-19 6 views
0

J'essaie de conserver les objets de la console à afficher en tant qu'étiquette (classifierText). L'avertissement de "UILabel.text doit être utilisé à partir du thread principal uniquement" apparaît. Qu'est-ce qui semble être le problème de savoir pourquoi les articles sont présentés comme l'étiquette?AVCaptureVideo n'affiche pas l'étiquette

var previewLayer: AVCaptureVideoPreviewLayer! 

let classifierText: UILabel = { 
    let classifier = UILabel() 
    classifier.translatesAutoresizingMaskIntoConstraints = false 
    classifier.textColor = .black 
    classifier.font = UIFont(name: "Times-New-Roman", size: 10) 
    classifier.textAlignment = .center 
    return classifier 
}() 

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { 
    guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return } 
    guard let model = try? VNCoreMLModel(for: Resnet50().model) else { return } 
    let request = VNCoreMLRequest(model: model) { (finishedReq, err) in 
    let results = finishedReq.results as? [VNClassificationObservation] 
    let firstObservation = results!.first 
    self.classifierText.text = "\(firstObservation!.identifier as String)" 

Répondre

1

La méthode captureOutput(sampleBuffer, etc) ne fonctionne pas sur le thread principal. Vous essayez donc de changer l'étiquette d'un thread qui n'est pas le thread principal.

La solution est de planifier le travail sur le thread principal, comme ceci:

DispatchQueue.main.async { 
    self.classifierText.text = "\(firstObservation!.identifier as String)" 
} 
+0

Merci @Matthijis! Cela a fait fonctionner! – Terril320