ios - 如何在视图中“解包”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 中的内容执行一些操作。
解决方案
每一个@StateObject var model = CameraService()
都是服务的一个单独实例。里面的人SwiftCameraApp
看不到ViewA
在做什么,反之亦然。
如果您希望他们使用EnvironmentObject
from SwiftCameraApp
>>进行过去的通信,或者您可以将您的服务更改为单例Home
。ViewA
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
推荐阅读
- python - 如何处理设计中的可选参数?
- firebase - 像文档一样命名的 Flutter FCM 主题
- flutter - Flutter 获取蓝牙名称连接的设备
- r - 模拟 (Y1, Y2) 上的数据,其中 Y2 有缺失值
- android - 为什么 Kotlin 在引用 proguard-removed 方法时会抛出 NullPointerException?
- machine-learning - scikit-learn 算法用于多类分类的默认机制是什么?
- ajax - WooCommerce 相关产品 - 加载更多 (ajax)
- python - 使用 FastAPI 下载 pdfkit PDF
- ruby-on-rails - 如何创建可以邀请、邀请和拥有用户的群组?
- scrapy - 刮完所有页面之前的刮擦整理过程