iOSデバイスの[ビデオ]カメラから「ライブストリーム」を取得し、バックグラウンドで発生するCoreMLイメージ分類タスクがあります。オブジェクトが特定され、他のアプリケーションロジックが発生したら、UIのラベルをいくつかのデータで更新したいと思います。Swift 4:DispatchQueue.main(範囲)のアクセス変数
DispatchQueue.main.asyc(execute: { })
へのコールアウトが、私が作業していた変数にどのようにアクセスできるか説明できますか?私はこれが本質的にスコープの問題だと思いますか?
コード私は現在使用しています:問題の原因となっているswitch文の内側
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
processCameraBuffer(sampleBuffer: sampleBuffer)
}
func processCameraBuffer(sampleBuffer: CMSampleBuffer) {
let coreMLModel = Inceptionv3()
if let model = try? VNCoreMLModel(for: coreMLModel.model) {
let request = VNCoreMLRequest(model: model, completionHandler: { (request, error) in
if let results = request.results as? [VNClassificationObservation] {
var counter = 0
var otherVar = 0
for item in results[0...9] {
if item.identifier.contains("something") {
print("some app logic goes on here")
otherVar += 10 - counter
}
counter += 1
}
switch otherVar {
case _ where otherVar >= 10:
DispatchQueue.main.async(execute: {
let displayVarFormatted = String(format: "%.2f", otherVar/65 * 100)
self.labelPrediction.text = "\(counter): \(displayVarFormatted)%"
})
default:
DispatchQueue.main.async(execute: {
self.labelPrediction.text = "No result!"
})
}
}
})
if let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) {
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
do {
try handler.perform([request])
} catch {
print(error.localizedDescription)
}
}
}
}
そのself.labelPrediction.text = ""
ライン。この変数は現在常に0です。
上記の行にブレークポイントを置き、変数に含まれる内容を確認してください。 (一般に、ブロックは必要な値を取得します。) –