在 JSON 调用后努力保存数据

Struggling with saving data after JSON call

我正在尝试将 JSON 调用中的数据保存到一个变量中(如果它有所不同,则在 ViewDidLoad 中调用它)。我已经坚持了很长一段时间并且感到非常沮丧。

我知道已经有关于此的主题,但我似乎无法弄明白,我希望对我做错了什么有一个简单的解释。

编辑:在执行 JSON 调用之前,执行转到 "print("breakpoint")" 行,我想强制执行等待,这样我才能真正填满 wantedCARDSET 但我很挣扎如何做到这一点。抱歉,如果不清楚!

这是 viewDidLoad 中的调用

override func viewDidLoad() {
        super.viewDidLoad()
        setPickerView.dataSource = self
        setPickerView.delegate = self

        testJSONgrab.getCards(url: "https://mtgjson.com/json/WAR.json") {json, error in

            DispatchQueue.main.async {
                for item in json {
                    self.wantedCARDSET.append(item)
                }
            }
        }

        print("breakpoint")

getCards 函数

class mtgJSONDATA {
    func getCards(url: String, completionHandler: @escaping ([CARDS], Error?)-> Void) {

        var cardSet = [CARDS]()
        guard let url = URL(string:url) else {return}
        let session = URLSession.shared
        let task = session.dataTask(with: url, completionHandler: {
            (data, response, error) in
            if error == nil {
                guard let data = data else {return}
                do {
                    let decoded = try JSONDecoder().decode(mtgJSON.self, from: data)
                    DispatchQueue.main.async {
                        for item in decoded.cards! {
                            cardSet.append(item)
                        }
                        completionHandler(cardSet, nil)
                    }
                } catch let jsonError {
                    print("Error serializing JSON: ", jsonError)
                }
            }
        })
        task.resume()
    }

您错过了重新加载

DispatchQueue.main.async { 
   self.wantedCARDSET = item 
   self.setPickerView.reloadAllComponents()
}

因为获取数据的调用是异步的