【问题标题】:SwiftUI persist observable objectsSwiftUI 持久化可观察对象
【发布时间】:2020-04-28 19:12:20
【问题描述】:

我正在尝试了解 swiftUI 中的数据流。

我创建了一个 ViewModel,其中包含来自网络请求的一些数据。

import SwiftUI

struct breakdown: Decodable {
    var sms: Int
    var im: Int
    var total: Int
}

struct weeklyOverviewStruct: Decodable {
    var data: [breakdown]
}

class WeeklyOverviewViewModel: ObservableObject {

    @Published var overviewData: weeklyOverviewStruct?

    func getBreakdown(){

        semaphore.wait()

              Network.Request(method: .GET , parameters: nil, endPoint: "rest/operator/stats/weekly/breakdown", completion: {
                         result,error  in

                         if(error == nil){

                          do {
                              let breakdown = try JSONDecoder().decode(weeklyOverviewStruct.self, from: result!)
                            DispatchQueue.main.async {

                                self.overviewData = breakdown

                            }

                          }catch{
                              print("Json Error")
                          }
                         }else{
                             print("\(error!)")
                         }
                     })
    }

}

据我了解,我可以在第二个视图中观察此 ViewModel,如果 ViewModel 发生更改,该视图将重新绘制:

struct SecondView: View {

     @ObservedObject var WeeklyOverviewVM = WeeklyOverviewViewModel()

       var body: some View {
        Text(String.init(describing: WeeklyOverviewVM.overviewData?.data[0].total))
    }
}

如果在调用 getBreakDown() 之后显示第二个视图,则观察对象为 nil。

有没有办法持久化数据,这样即使在调用 getBreakdown() 函数后呈现视图,前一个请求的数据也可以在第二个视图中观察到?

【问题讨论】:

标签: swift swiftui


【解决方案1】:

SecondView 现在每次实例化时都会创建视图模型,因此如果您希望之前获取的数据保持不变,它需要将该视图模型实例存储在 SecondView 之外的某个位置并在创建时将其注入,例如

struct SecondView: View {
     // only declare
     @ObservedObject var WeeklyOverviewVM: WeeklyOverviewViewModel 

在父视图中的某处

    ...
    // inject WeeklyOverviewViewModel from own property
    SecondView(WeeklyOverviewVM: self.secondViewVM)
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2020-07-29
    • 1970-01-01
    • 2020-07-07
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多