gpt4 book ai didi

ios - 计算属性 - 如何仅在主线程上使用?

转载 作者:行者123 更新时间:2023-11-28 05:57:27 24 4
gpt4 key购买 nike

我正在尝试使用 AVCaptureVideoPreviewLayer 来捕获视频,但是当我运行我的应用程序时,主线程检查器导致崩溃。

代码必须在什么时候在主线程上运行 - 我假设这将解决我遇到的问题。使用 DispatchQueue.main.async({}) 进行了多次尝试,但无济于事。

发生错误:

Main Thread Checker: UI API called on a background thread:

原文:

    var videoPreviewLayer: AVCaptureVideoPreviewLayer {

let previewlayer = layer as! AVCaptureVideoPreviewLayer

switch gravity {
case .resize:
previewlayer.videoGravity = AVLayerVideoGravity.resize
case .resizeAspect:
previewlayer.videoGravity = AVLayerVideoGravity.resizeAspect
case .resizeAspectFill:
previewlayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
}
return previewlayer
}

尝试修复:

var videoPreviewLayer: AVCaptureVideoPreviewLayer {

getVideoPreviewLayer { (previewLayer) in
return previewLayer
}
}

func getVideoPreviewLayer( completion: @escaping (AVCaptureVideoPreviewLayer) -> ()) {

DispatchQueue.main.async { [unowned self ] in

let previewlayer = self.layer as! AVCaptureVideoPreviewLayer

switch self.gravity {
case .resize:
previewlayer.videoGravity = AVLayerVideoGravity.resize
case .resizeAspect:
previewlayer.videoGravity = AVLayerVideoGravity.resizeAspect
case .resizeAspectFill:
previewlayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
}

completion(previewlayer)
}
}

原创 enter image description here尝试修复 enter image description here

最佳答案

这里有一个解决方案可以确保无论使用哪个队列访问 videoPreviewLayer 都只获取主队列上的图层:

var videoPreviewLayer: AVCaptureVideoPreviewLayer {
let previewlayer: AVCaptureVideoPreviewLayer = {
if Thread.current.isMainThread {
return layer as! AVCaptureVideoPreviewLayer
} else {
DispatchQueue.main.sync {
return layer as! AVCaptureVideoPreviewLayer
}
}
}()

switch gravity {
case .resize:
previewlayer.videoGravity = AVLayerVideoGravity.resize
case .resizeAspect:
previewlayer.videoGravity = AVLayerVideoGravity.resizeAspect
case .resizeAspectFill:
previewlayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
}
return previewlayer
}

关于ios - 计算属性 - 如何仅在主线程上使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51032194/

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