启动时的 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") 只在第一次构建时吐出,然后再次解析。 (不知何故,即使我向上滑动退出应用程序然后再次启动它也不会吐出打印()语句)