Как обновить текст uilabel в ответе swift 4

Я пытаюсь обновить label.text с ответом сервера. Но метка обновляется только после второго вызова метода. Что случилось?

dispatch_async(dispatch_get_main_queue()) устарел. Я изменил его на DispatchQueue.main.async, но он не работает.

Пример для swift 2: Быстрое изменение текста метки после загрузки содержимого веб-страницы

Не рабочий код:

@IBAction func buttonAction(_ sender: Any) {

    let url = URL(string: "https://api.nasa.gov/planetary/apod?date=2005-2-22&api_key=DEMO_KEY")!
    let task = URLSession.shared.dataTask(with: url) { [weak self] (data, response, error) in
        if let data = data,
            let stringData = String(data: data, encoding: .utf8) {
            print("stringData: \(stringData)") // prints every time

            DispatchQueue.main.async {
                // change label text after second calling.
                // ??? How to change label text at first calling ???
                self?.mainLabel.text = stringData
            }
        }
    }

    task.resume()
}

person Viktor    schedule 13.04.2018    source источник
comment
Проверить, является ли mainLabel нулевым при первом вызове?   -  person Ankit Jayaswal    schedule 13.04.2018
comment
mainLabel != ноль. это IBOutlet   -  person Viktor    schedule 13.04.2018


Ответы (1)


Попробуй это

var labelString : String = "" {
        didSet {
            self.mainLabel.text = labelString
        }
    }

Напишите ниже код внутри кнопкиAction

DispatchQueue.main.async {
        // change label text after second calling.
       // ??? How to change label text at first calling ???
        self?.labelString = stringData
  }
person iParesh    schedule 13.04.2018
comment
На симуляторе работает, но с задержкой 3-5 секунд. И не каждый раз. Но почему? Версия из вопроса работает на устройстве, но не работает на симуляторе. - person Viktor; 13.04.2018