首页 > 解决方案 > 如何在视图中“解包”Publisher 对象 [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(upstream: Combine.Published<Swift.Array<Foundation.URL>>.Publisher(subject: Combine.PublishedSubject<Swift.Array<Foundation.URL>>))

也许对了解有帮助。
a) 当 CameraService 启动时 videoClips 为空。在视图 A 中按下按钮后会添加一个值

。b)我认为在初始化视图时会创建一个新的 CameraService,使其成为一个空数组

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

标签: iosswiftswiftuiswift5combine

解决方案


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

如果您希望他们使用EnvironmentObjectfrom SwiftCameraApp>>进行过去的通信,或者您可以将您的服务更改为单例HomeViewA

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的 s 更改为@StateObject var model = CameraService.shared


推荐阅读