我正试图了解 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()函数后呈现了一个视图,在第二个视图中也可以观察到之前请求的数据?
该 SecondView
现在每次实例化时都会创建视图模型,所以如果你想让之前获取的数据持久化,它需要将该视图模型实例存储在 SecondView
并在其创建时注入,如
struct SecondView: View {
// only declare
@ObservedObject var WeeklyOverviewVM: WeeklyOverviewViewModel
而在父级视图中的某处
...
// inject WeeklyOverviewViewModel from own property
SecondView(WeeklyOverviewVM: self.secondViewVM)
...