SWIFT декодируемая передача данных - PullRequest
0 голосов
/ 30 июня 2018

У меня есть usernameTextField в viewController, где я ввожу имя пользователя и кнопку searchTapped со следующим кодом:

@IBAction func searchTapped(_ sender: UIButton) {
        guard let username = usernameTextField.text, username != "" else {
            displayWarningLabel(withText: "Information is incorrect")
            return
        }

        guard let gitUrl = URL(string: "https://api.github.com/users/\(username)/gists") else { return }
        URLSession.shared.dataTask(with: gitUrl) { (data, response, error) in

            guard let data = data else { return }
            guard error == nil else { return }
            do {
                let gitData = try JSONDecoder().decode([Gists].self, from: data)
                DispatchQueue.main.async {
                    self.gists = gitData
                }
            } catch let error {
                print(error)
            }
            }.resume()

        performSegue(withIdentifier: "GistsSegue", sender: nil)
    }

после получения данных от json я хочу сохранить данные в массив gists вне этого метода, но этого не происходит.

 var gists = [Gists]()

В чем может быть проблема?

На всякий случай, это моя модель для разбора json:

struct Gists: Codable {
    var description: String?
    var files: [String: DetailGist]
}

struct DetailGist: Codable {
    var filename: String?
    var raw_url: String?
}

1 Ответ

0 голосов
/ 30 июня 2018

self.gists = gitData вызывается, но вызывается задолго после того, как вы позвоните performSegue. Это характер асинхронного доступа к данным.

Просто переместите ваш performSegue вызов сразу после того, как вы установили self.gists.

DispatchQueue.main.async {
    self.gists = gitData
    performSegue(withIdentifier: "GistsSegue", sender: nil)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...