Отображение информации из декодированного JSON в UILabel (Swift 4) - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь отобразить информацию, взятую из JSON.Я использовал .decode, чтобы получить его.Теперь я хочу поместить его текст на простой ярлык на моей раскадровке.Внизу под ".resume ()" моя попытка, и она не работает.Я не могу понять это.


import UIKit


struct WebsiteDescription: Decodable {
    var name : String
    var description : String
    var courses : [Course]

}


struct Course: Decodable {
    let id: Int
    let name: String
    let link: String
    let imageUrl: String
}

class ViewController: UIViewController {

    @IBOutlet weak var displayLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
        guard let url = URL(string: jsonUrlString) else {return}
        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else {return}

            do {
                let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
                print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
                //let courses = try JSONDecoder().decode([Course].self, from: data)
            } catch let jsonErr {
                print("Error serializing json", jsonErr)
            }

        }.resume()

        let displayLabel.text = websiteDescription.name

    }

}

1 Ответ

0 голосов
/ 29 ноября 2018

Вам необходимо обновить ярлык из метода do.Также вы должны сделать это из основного потока, чтобы пользовательский интерфейс мог быть обновлен.Я обновил код ниже.

import UIKit

struct WebsiteDescription: Decodable { 
    var name : String 
    var description : String 
    var courses : [Course]
}

struct Course: Decodable { 
    let id: Int 
    let name: String 
    let link: String 
    let imageUrl: String 
}

class ViewController: UIViewController {

    @IBOutlet weak var displayLabel: UILabel!

    override func viewDidLoad() {
    super.viewDidLoad()

        let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
        guard let url = URL(string: jsonUrlString) else {return}
        URLSession.shared.dataTask(with: url) { (data, response, err) in
        guard let data = data else {return}

        do {
            let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
            print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
            //let courses = try JSONDecoder().decode([Course].self, from: data)

            DispatchQueue.main.async {
                self.displayLabel.text = websiteDescription.name
            }

         } catch let jsonErr {
            print("Error serializing json", jsonErr)
        }

    }.resume()
}
...