我有一个包含ViewModel的主视图,它是这样声明的
@ObservedObject var viewModel = ViewModel()
一切正常,但是当我将应用程序移至后台然后移至前景时,View会重新创建自身以及我的viewModel,并且存储在viewModel中的所有内容都会消失。
在这种情况下,使ViewModel为单例类可以解决此问题,但是使所有ViewModels单例类不是一个好主意。
是否有解决方法?
答案 0 :(得分:2)
由于其他原因,制作ObservedObject
单身并不是一个好主意。由于要预览视图,因此必须以某种方式注入视图模型,以使其在更复杂的情况下变得更容易。
只要我需要在SwiftUI
中使用单例,我都会考虑使用从EnvironmentObject
(在实际应用中)或从SceneDelegate
添加的PreviewProvider
预习。如果您将引用存储在SceneDelegate
中,它将不会重新创建。
关于内存泄漏的问题,如果视图模型中没有保留周期,则不应泄漏。它将由ARC清除。
答案 1 :(得分:1)
如果您要针对iOS 14进行构建,请查看@StateObject。 SwiftUI为每个声明@StateObject的容器创建一次,并将其保存在视图生命周期之外。这意味着视图拥有值,并且值的生命周期与视图的生命周期(而不是结构)相关联。
此处提供更多信息:https://developer.apple.com/documentation/swiftui/stateobject
答案 2 :(得分:0)
对于应该共享的数据,SwiftUI给了我们@EnvironmentObject