Борьба с сохранением данных после вызова JSON - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь сохранить данные из вызова JSON в переменную (вызывая это в ViewDidLoad, если это имеет значение).Я застрял на этом довольно долго и очень расстраиваюсь.

Я знаю, что уже есть темы на эту тему, но я не могу понять это, и я надеюсь, что это простообъяснение того, что я делаю неправильно.

Редактирование: выполнение передается в строку "print (" точка останова ")" перед вызовом JSON. Я хочу принудительно заставить выполнение ждать, чтобы я мог на самом деле заполнитьдо хотел карты, но я борюсь с тем, как это сделать.Извините, если это было неясно!

Вот вызов в 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()
    }

1 Ответ

0 голосов
/ 02 мая 2019

Вы пропустили перезагрузку

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

Поскольку вызов для получения ваших данных является асинхронным

...