Вы должны использовать DispatchQueue.main.sync
, потому что хотите дождаться ответа (вы хотите вернуть полученное значение).Использование async приведет к продолжению работы вашего кода до того, как вы получите значение.
Вам также не нужно иметь дело с отдельной функцией.
Вот простое исправление, которое должно работать:
var videoPreviewLayer: AVCaptureVideoPreviewLayer {
let capturedLayer = DispatchQueue.main.sync {
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
}
return capturedLayer
}
Однако вы можете столкнуться с проблемами, пытаясь что-то сделать со слоем, возвращенным из этой функции, потому что вы будете вне основного потока.Вероятно, это хорошая идея, чтобы перейти к основному потоку с DispatchQueue.main.sync
где-то еще (где-то в контексте, который получает переменную videoPreviewLayer).