2017-09-19 17 views
0

コンソールからオブジェクトを保持して、ラベル(classifierText)として表示しようとしています。 「UILabel.textはメインスレッドのみから使用する必要があります」という警告が表示されます。アイテムがラベルとして表示されている理由は何ですか?AVCaptureVideoにラベルが表示されない

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)" 

答えて

1

メソッドcaptureOutput(sampleBuffer, etc)は、メインスレッドで実行されません。したがって、メインスレッドではないスレッドからラベルを変更しようとしています。

ソリューションはそうのように、メインスレッド上で作業をスケジュールすることです:

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

が@Matthijisありがとうございました!それがうまくいった! – Terril320

関連する問題