nodejs同时做网站和后台管理,黑龙江住房城乡建设厅网站,视频特效制作软件,全国公示信用信息系统SwiftUI中的StateObject和ObservedObject属性包装器指示视图更新以响应被观察对象的变化。虽然这两个属性包装器看起来很相似#xff0c;但在使用SwiftUI构建应用程序时#xff0c;有一个关键的区别需要理解。
两个属性包装器都要求对象符合ObservableObject协议。这个协议表…SwiftUI中的StateObject和ObservedObject属性包装器指示视图更新以响应被观察对象的变化。虽然这两个属性包装器看起来很相似但在使用SwiftUI构建应用程序时有一个关键的区别需要理解。
两个属性包装器都要求对象符合ObservableObject协议。这个协议表明在对象改变之前有发布者(Published变量)通知SwiftUI触发视图的重绘。
StateObject的介绍和使用
StateObject属性包装器与其他属性包装器不同StateObject负责创建和管理包装对象的生命周期与StateObject相关联的对象在拥有它的视图的生命周期内持续存在。
在一下两种情况下应该使用StateObject属性包装器
初始化一次由视图拥有的属性
初始化一次当由于外部数据更改或重绘操作而重新计算绘制视图主体时用StateObject包装的属性不受影响。
属于视图数据的生命周期与视图的生命周期相关联。一旦拥有数据的视图被释放数据就会被释放。
在使用的时候也是比较简单的如下
import SwiftUIstruct VideosView: View {StateObject private var viewModel VideoViewModel()var body: some View {List(viewModel.notes, id: \.self) { video inText(video.title)}}
}final class VideoViewModel: ObservableObject {Published private(set) var videos: [Video] []
}
StateObject属性包装器包装后的对象只初始化一次并在视图更新期间持续存在。不过StateObject属性包装器只能与引用类型一起使用因为只有引用类型才能符合ObservableObject协议。
ObservedObject的介绍和使用
上面了解了StateObject属性包装器在拥有和管理SwiftUI视图中的数据方面起着重要的作用。不过并不是每一块数据都需要或应该由显示它的视图拥有。这就是ObservedObject属性包装器发挥作用的地方。与StateObject不同的是ObservedObject被设计成在不获取所有权的情况下观察和响应引用类型的变化。
ObservedObject并不拥有或管理它所观察对象的生命周期。它只是监听observable对象中的变化并触发视图的更新。
如果数据是外部的则选择ObservedObject属性包装器。
如果视图需要显示由外部源(如父视图或共享数据存储)拥有和管理的数据则选择ObservedObject属性包装器。
使用的时候不需要初始化viewModel而是由外部传入。
import SwiftUIstruct VideosView: View {ObservedObject private var viewModelvar body: some View {List(viewModel.notes, id: \.self) { video inText(video.title)}}
}final class VideoViewModel: ObservableObject {Published private(set) var videos: [Video] []
}
使用ObservedObject而不是StateObject因为视图不会创建和管理VideoViewModel。当视图被释放时VideoViewModel不应该被释放。
如果发生外部数据更改ObservedObject属性包装器允许视图更新其主体。它使得在视图之间共享数据变得更加容易。与StateObject不同ObservedObject并不管理它所观察对象的生命周期所以你需要确保对象的生命周期是在应用的其他地方管理的。
总结
StateObject和ObservedObject有相似的特性但是它们在SwiftUI如何管理它们的生命周期方面有所不同。当当前视图创建观察对象时使用StateObject属性包装器确保结果一致。当注入一个被观察对象作为依赖时使用ObservedObject。