启动时的 SwiftUI 全局 var 和 func
SwiftUI global var and func at launch
我有一个解析 json 的函数。然后我使用该数据来填充一堆 UI 插槽。问题是它很大 json(如果 10.1MB 很大)并且加载需要 5-8 秒。在应用程序启动时这没什么大不了的,但现在它每次都在重复该数据。
现在我只有这个模式,每个结构视图都以:
var results = [ScryfallCard]()
.onApear {
results = func()
}
func() -> [ScryfallCard]
我一辈子都找不到如何创建一个全局变量,将其分配给 var globleResults = func()
这样我的应用程序就可以预先加载所有数据并且不需要 5 秒来加载每个数据查看。
为了让您的视图更新结果,您需要将结果 results
变成 @State var results: [ScryfallCard] = []
然后使用处理 JSON 的函数,无论处理需要多长时间,它都应该在 results = func()
完成后更新视图。
避免使用全局变量,旨在创建不同的组件来封装变量。
你会有这样的东西
class NetworkRequester: ObservableObject {
@Published var results: [String] = []
var cancellable: AnyCancellable?
func getResults() {
cancellable = URLSession.shared.dataTaskPublisher(for: URL(fileURLWithPath: "path-to-JSON")!)
.map({ [=10=].data })
.decode(type: [ScryfallCard].self, decoder: JSONDecoder())
.sink(receiveCompletion: { result in
switch result {
case .failure(let error):
print(error)
case .finished:
break
}
}) { newResults in
self.results = newResults
}
}
}
评论中建议的 link 是了解有关如何处理渲染数据的更多信息的有用资源。
好的...明白了。有点笨拙,但它有效。
我基本上必须从顶部开始并将 @EnvironmentObject var globalCards : ScryfallData
放入我的 ContentView 中。在每个视图中添加 @ObservedObject var globalCards = ScryfallData()
并将 globalCards: globalCards
传递到下一个视图。然后在最后一个视图中使用我列表中的 List(globalCards.parsedResults, id: \.id) { item in
。
我的 print("Parsing...") print("Parsing complete")
只在第一次构建时吐出,然后再次解析。 (不知何故,即使我向上滑动退出应用程序然后再次启动它也不会吐出打印()语句)
我有一个解析 json 的函数。然后我使用该数据来填充一堆 UI 插槽。问题是它很大 json(如果 10.1MB 很大)并且加载需要 5-8 秒。在应用程序启动时这没什么大不了的,但现在它每次都在重复该数据。
现在我只有这个模式,每个结构视图都以:
var results = [ScryfallCard]()
.onApear {
results = func()
}
func() -> [ScryfallCard]
我一辈子都找不到如何创建一个全局变量,将其分配给 var globleResults = func()
这样我的应用程序就可以预先加载所有数据并且不需要 5 秒来加载每个数据查看。
为了让您的视图更新结果,您需要将结果 results
变成 @State var results: [ScryfallCard] = []
然后使用处理 JSON 的函数,无论处理需要多长时间,它都应该在 results = func()
完成后更新视图。
避免使用全局变量,旨在创建不同的组件来封装变量。
你会有这样的东西
class NetworkRequester: ObservableObject {
@Published var results: [String] = []
var cancellable: AnyCancellable?
func getResults() {
cancellable = URLSession.shared.dataTaskPublisher(for: URL(fileURLWithPath: "path-to-JSON")!)
.map({ [=10=].data })
.decode(type: [ScryfallCard].self, decoder: JSONDecoder())
.sink(receiveCompletion: { result in
switch result {
case .failure(let error):
print(error)
case .finished:
break
}
}) { newResults in
self.results = newResults
}
}
}
评论中建议的 link 是了解有关如何处理渲染数据的更多信息的有用资源。
好的...明白了。有点笨拙,但它有效。
我基本上必须从顶部开始并将 @EnvironmentObject var globalCards : ScryfallData
放入我的 ContentView 中。在每个视图中添加 @ObservedObject var globalCards = ScryfallData()
并将 globalCards: globalCards
传递到下一个视图。然后在最后一个视图中使用我列表中的 List(globalCards.parsedResults, id: \.id) { item in
。
我的 print("Parsing...") print("Parsing complete")
只在第一次构建时吐出,然后再次解析。 (不知何故,即使我向上滑动退出应用程序然后再次启动它也不会吐出打印()语句)