gpt4 book ai didi

Swift 4 : Access Variables from DispatchQueue. 主要(范围)

转载 作者:行者123 更新时间:2023-11-30 11:56:59 25 4
gpt4 key购买 nike

我有一个 CoreML 图像分类任务,它从 iOS 设备的 [视频] 摄像头获取“实时流”并在后台进行。一旦识别了对象,并且发生了其他应用程序逻辑,我想用一些数据更新 UI 的标签。

有人可以解释一下对 DispatchQueue.main.asyc(execute: { }) 的调用如何能够访问我一直在使用的变量吗?我认为这本质上是一个范围界定问题?

我当前使用的代码:

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

switch 语句中的 self.labelPrediction.text = "" 行导致了问题。目前该变量始终为 0。

最佳答案

这不是DispatchQueue的问题。从 processCameraBuffer(sampleBuffer:) 中,您的代码会在获得结果之前更新您的 UI。

要解决这个问题,您需要使用转义闭包。您的函数应该如下所示。

func processCameraBuffer(sampleBuffer: CMSampleBuffer, completion: @escaping (Int, String) -> Void) {
// 2.
let request = VNCoreMLRequest(model: model, completionHandler: { (request, error) in

DispatchQueue.main.async(execute: {
// 3.
let displayVarFormatted = String(format: "%.2f", otherVar / 65 * 100)
completion(counter, displayVarFormatted)
})
}
}

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
// 1.
processCameraBuffer(sampleBuffer) { counter, displayVarFormatted in
/*
This Closure will be executed from
completion(counter, displayVarFormatted)
*/
// 4.
self.labelPrediction.text = "\(counter): \(displayVarFormatted)%"
}
}

变量的范围从这里开始不是问题。您需要处理异步任务。

  1. 捕获发生。
  2. 调用 processCameraBuffer 并执行 VNCoreMLRequest
  3. 您将通过 completion() 获取数据并执行 processCameraBuffer 的完成 block 。
  4. 更新标签。

关于Swift 4 : Access Variables from DispatchQueue. 主要(范围),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47695883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com