如何在视图中'unwrap'发布服务器对象 [swift]



我将如何将数组内容分配给变量以在视图中使用。

struct SwiftCameraApp: App {
@StateObject var service = CameraService()
var body: some Scene {
WindowGroup {
Home()
.environmentObject(service)     
}
}
public class CameraService: NSObject, ObservableObject {

@Published var videoClips = [URL]()
public func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
print("finished recording the video to: (outputFileURL)")
print(output.recordedDuration)
videoClips.append(outputFileURL)

//returns 1 at this point
print("(videoClips.count) video clip is now in the camera service")
}
struct ViewA: View {
@StateObject var model = CameraService()
Button("Adds item to videoClips") {
model.fileOutput()
}    
}
struct ViewB: View {
@EnvironmentObject var service : CameraService
var body: some View {
Button("Prints Array count") {
print(service.$videoClips.count())
}
}
}

输出:

Count(上游: Combine.Published>.Publisher(主题:Combine.PublishSubject>))

也许有帮助。
a) 当相机服务启动时,视频剪辑为空。在视图 A 中按下按钮后添加一个值。

b) 我认为当视图初始化时,会创建一个新的相机服务,使其成为一个空数组

c) 这个想法是拍摄视频。将其附加到 videoClips 数组,然后对视图 B 中的内容执行某些操作。

也许你只是想要(即数组中的元素数量):

Button("Prints Array count") {
print(service.videoClips.count)
}

更新:它在ViewA中使用了不同的CameraService对象,所以更新ViewAViewB没有任何变化,因为模型的实例不一样。

相反,您需要使用对相同CameraService的引用,即环境对象中提供的

那个
struct ViewA: View {
@EnvironmentObject var model: CameraService   // << here !!
Button("Adds item to videoClips") {
model.fileOutput()
}    
}

>@StateObject var model = CameraService()中的每一个都是服务的单独实例。SwiftCameraApp的人看不到ViewA在做什么,反之亦然。

如果您希望他们使用来自SwiftCameraApp>Home>ViewAEnvironmentObject进行通信,或者您可以将服务更改为单例。

public class CameraService: NSObject, ObservableObject {
static let shared = CameraService()
@Published var videoClips = [URL]()
private init(){}
public func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
print("finished recording the video to: (outputFileURL)")
print(output.recordedDuration)
videoClips.append(outputFileURL)

//returns 1 at this point
print("(videoClips.count) video clip is now in the camera service")
}

并将您的StateObject更改为@StateObject var model = CameraService.shared

最新更新