我正在开发一个应用程序,该应用程序使用AVCaptureLayer
来显示视频预览层以及亮度的文本表示(根据视频元数据计算(。我试图通过在类VideoStream
中只创建一个AVCaptureSession
来提高我的应用程序的效率,然后我想将捕获会话传递给创建显示视频预览层的UIView
的UIViewRepresentable
。View
很简单:
struct ContentView: View {
@StateObject var videoStream = VideoStream() // holds session variable for AVCaptureSession
var body: some View {
VStack {
VideoPreviewHolder(runningSession: videoStream.session) // videoStream.session not initialized at build time
}.frame(width: 300, height: 300, alignment: .center)
Text(String(format: "%.2f Lux", videoStream.luminosityReading))
.font(.largeTitle)
}
}
SwiftUI是否提供了一种等待StateObject
类初始化的方法?VideoStream()
的init()
方法调用一个函数,该函数负责首先检查相机授权,并在必要时请求授权,如果授权被授予,则调用配置AVCaptureSession
的第二个函数。这一切都需要相当长的时间,尤其是当用户需要授予或拒绝授权时。
我已经尝试将await / async
添加到VideoStream()
初始值设定项和其中调用的函数中,但由于我的VideoStream()
类继承自NSObject
,所以我收到一个错误async initializer cannot be represented in Objective-C
。
是否有SwiftUI特定的方式来等待StateObject
的初始化?
使VideoStream
的session
属性可选并发布:
class VideoStream: ObservableObject {
@Published var session: AVCaptureSession?
// blah blah blah
}
在完全配置会话之前,不要设置该属性。如果需要的话,请确保将调度回主队列/线程/演员进行设置。
然后查看属性是否为零:
struct ContentView: View {
@StateObject var videoStream = VideoStream()
var body: some View {
if let session = videoStream.session {
VStack {
VideoPreviewHolder(runningSession: session)
}.frame(width: 300, height: 300, alignment: .center)
Text(String(format: "%.2f Lux", videoStream.luminosityReading))
.font(.largeTitle)
} else {
ProgressView()
}
}
}