等待SwiftUI中的StateObject初始化



我正在开发一个应用程序,该应用程序使用AVCaptureLayer来显示视频预览层以及亮度的文本表示(根据视频元数据计算(。我试图通过在类VideoStream中只创建一个AVCaptureSession来提高我的应用程序的效率,然后我想将捕获会话传递给创建显示视频预览层的UIViewUIViewRepresentableView很简单:

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的初始化?

使VideoStreamsession属性可选并发布:

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

}

最新更新