【问题标题】:SwiftUI global var and func at launch启动时的 SwiftUI 全局变量和函数
【发布时间】:2020-11-15 09:12:33
【问题描述】:

我有这个解析 json 的函数。然后我使用这些数据来填充一堆 UI 插槽。问题是它是一个很大的 json(如果 10.1MB 很大),加载需要 5-8 秒。在应用发布时这没什么大不了的,但现在它每次都会重新生成这些数据。

现在我只有这种模式,每个结构视图都以:

var results = [ScryfallCard]()

.onApear {
    results = func()
}

func() -> [ScryfallCard]

我终其一生都找不到如何创建一个全局变量,将其分配为 var globleResults = func(),以便我的应用预先加载所有这些数据,并且加载每个视图不需要 5 秒。

【问题讨论】:

标签: ios swift swiftui global-variables launch


【解决方案1】:

为了让你的视图更新结果,你需要把你的结果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({ $0.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
        }
    }
}

评论中建议的链接是了解如何处理渲染数据的有用资源。

【讨论】:

  • 这两个答案似乎都假设数据可能会神奇地改变。卡片列表最多每天只更改一次,通常几个月不会更改。但是,每当我尝试使用 State 的东西使数据“智能”时,即使是简单的东西,比如点击列表中的项目,显示详细视图,也总是需要很长时间。点击后退按钮也需要很长时间。需要预先加载大量卡片,然后根据需要调用。
  • 实际上不同的问题。是否可以将解析的 JSON 保存到磁盘。然后在应用中读回解析出来的json内容?
  • @Zerafiall 一个新问题 -> 一个新帖子。这些是 SO 规则。
【解决方案2】:

好的...想通了。有点笨拙,但它有效。

我基本上必须从顶部开始并将@EnvironmentObject var globalCards : ScryfallData 放入我的 ContentView 中。在每个视图添加@ObservedObject var globalCards = ScryfallData() 并将globalCards: globalCards 传递给下一个视图。然后在最后一个视图中,只需在我的列表中使用List(globalCards.parsedResults, id: \.id) { item in

我的print("Parsing...") print("Parsing complete") 仅在第一次构建时吐出,然后再次解析。 (不知何故,即使我向上滑动退出应用程序然后再次启动它,它也不会吐出 print() 语句)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多