SwiftUI持久化可观察对象

问题描述 投票:0回答:1

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

我已经创建了一个ViewModel,其中保存了来自网络请求的一些数据,我的理解是,我可以在第二个视图中观察这个ViewModel,如果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个回答
0
投票

SecondView 现在每次实例化时都会创建视图模型,所以如果你想让之前获取的数据持久化,它需要将该视图模型实例存储在 SecondView 并在其创建时注入,如

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

而在父级视图中的某处

    ...
    // inject WeeklyOverviewViewModel from own property
    SecondView(WeeklyOverviewVM: self.secondViewVM)
    ...
© www.soinside.com 2019 - 2024. All rights reserved.