Swiftui 如何在应用程序运行时保持数据的持久性?

Swiftui 如何在应用程序运行时保持数据的持久性?,swiftui,combine,Swiftui,Combine,场景:我通过@observeObject/@Publish从服务器检索数据;在选项卡视图()中 数据按预期显示 然而,当我从另一个选项卡返回到选项卡视图时,我发现数据不见了,需要我进行另一次不需要的获取 这是订户: struct NYTStatesView: View { @ObservedObject var dataSource = NYTStatesModel() ... } 以下是出版商: final class NYTStatesModel: ObservableOb

场景:我通过@observeObject/@Publish从服务器检索数据;在选项卡视图()中

数据按预期显示
然而,当我从另一个选项卡返回到选项卡视图时,我发现数据不见了,需要我进行另一次不需要的获取

这是订户:

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实际上会转储结果。这里有两篇文章会有所帮助。第一个是如何创建缓存,第二个是如何创建环境密钥


只需在网络调用之前使用依赖项注入检查缓存。缓存被持久保存在环境中。

这就是我的想法。单例方法非常简单;但是收集到的所有数据都很拥挤。单身的美女是。。。您可以在显示视图之前提前访问所有数据,以避免最初显示视图时出现延迟。数据提前就在那里。是的,您可以在应用程序中的任意点加载数据。关于静态属性的另一件很酷的事情是,它们是惰性初始化的,所以如果您第一次使用它,可能是在显示该视图时,这就是我所想的。单例方法非常简单;但是收集到的所有数据都很拥挤。单身的美女是。。。您可以在显示视图之前提前访问所有数据,以避免最初显示视图时出现延迟。数据提前就在那里。是的,您可以在应用程序中的任意点加载数据。关于静态属性的另一件很酷的事情是,它们是惰性初始化的,所以如果您第一次使用它,可能是在显示该视图时