【发布时间】: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() 函数后呈现视图,前一个请求的数据也可以在第二个视图中观察到?
【问题讨论】:
-
你也可以使用 Environment...这对我理解 SwiftUI/Bindings developer.apple.com/videos/play/wwdc2019/226 有很大帮助