Swiftui 如何在应用程序运行时保持数据的持久性?
场景:我通过@observeObject/@Publish从服务器检索数据;在选项卡视图()中 数据按预期显示Swiftui 如何在应用程序运行时保持数据的持久性?,swiftui,combine,Swiftui,Combine,场景:我通过@observeObject/@Publish从服务器检索数据;在选项卡视图()中 数据按预期显示 然而,当我从另一个选项卡返回到选项卡视图时,我发现数据不见了,需要我进行另一次不需要的获取 这是订户: struct NYTStatesView: View { @ObservedObject var dataSource = NYTStatesModel() ... } 以下是出版商: final class NYTStatesModel: ObservableOb
然而,当我从另一个选项卡返回到选项卡视图时,我发现数据不见了,需要我进行另一次不需要的获取 这是订户:
struct NYTStatesView: View {
@ObservedObject var dataSource = NYTStatesModel()
...
}
以下是出版商:
final class NYTStatesModel: ObservableObject {
@Published var revisedNYTStates: RevisedNYTStates!
// ...
}
数据源。ReviedNytStates返回视图时为空
问题:如何保留数据,以便不必总是访问服务器的逐视图显示?切换选项卡时,将重新创建
数据源
:
struct NYTStatesView: View {
@ObservedObject var dataSource = NYTStatesModel()
...
}
解决方案可能是在选项卡视图外部创建数据源
例如,在应用程序级别:
@main
struct TestApp: App {
@StateObject private var dataSource = NYTStatesModel()
...
}
(或在SwiftUI 1.0的SceneDelegate
中)切换选项卡时,将重新创建数据源
:
struct NYTStatesView: View {
@ObservedObject var dataSource = NYTStatesModel()
...
}
解决方案可能是在选项卡视图外部创建数据源
例如,在应用程序级别:
@main
struct TestApp: App {
@StateObject private var dataSource = NYTStatesModel()
...
}
(或者在SwiftUI 1.0的SceneDelegate
中)这也是我挣扎了一段时间的事情。有两种不同的方法来做你想做的事
第一种方法是从视图层次结构中较高的位置创建装入器类,并将其传递到需要的位置。例如,您可以在应用程序主结构中创建加载程序,并将其作为环境对象传入。在我看来,这种方法是可伸缩性最低、最混乱的
第二种选择是使用单例或静态属性来持久化数据。例如,您可以将您的NYTStatesModel设置为singleton。(我不宽恕这种行为)
第三个(也是最好的IMO)是创建一个类,该类负责缓存结果并将结果从环境传递到视图模型中。当您的手机内存不足时,NSCache实际上会转储结果。这里有两篇文章会有所帮助。第一个是如何创建缓存,第二个是如何创建环境密钥
只需在网络调用之前使用依赖项注入检查缓存。缓存被保存在环境中。这也是我曾经努力解决的问题。有两种不同的方法来做你想做的事
第一种方法是从视图层次结构中较高的位置创建装入器类,并将其传递到需要的位置。例如,您可以在应用程序主结构中创建加载程序,并将其作为环境对象传入。在我看来,这种方法是可伸缩性最低、最混乱的
第二种选择是使用单例或静态属性来持久化数据。例如,您可以将您的NYTStatesModel设置为singleton。(我不宽恕这种行为)
第三个(也是最好的IMO)是创建一个类,该类负责缓存结果并将结果从环境传递到视图模型中。当您的手机内存不足时,NSCache实际上会转储结果。这里有两篇文章会有所帮助。第一个是如何创建缓存,第二个是如何创建环境密钥
只需在网络调用之前使用依赖项注入检查缓存。缓存被持久保存在环境中。这就是我的想法。单例方法非常简单;但是收集到的所有数据都很拥挤。单身的美女是。。。您可以在显示视图之前提前访问所有数据,以避免最初显示视图时出现延迟。数据提前就在那里。是的,您可以在应用程序中的任意点加载数据。关于静态属性的另一件很酷的事情是,它们是惰性初始化的,所以如果您第一次使用它,可能是在显示该视图时,这就是我所想的。单例方法非常简单;但是收集到的所有数据都很拥挤。单身的美女是。。。您可以在显示视图之前提前访问所有数据,以避免最初显示视图时出现延迟。数据提前就在那里。是的,您可以在应用程序中的任意点加载数据。关于静态属性的另一件很酷的事情是,它们是惰性初始化的,所以如果您第一次使用它,可能是在显示该视图时