ios - 在 UILabel (Swift 4) 中显示来自解码 JSON 的信息
问题描述
我正在尝试显示从 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
}
}
解决方案
您需要从 do 方法中更新您的标签。此外,您应该从主线程执行此操作,以便可以更新 UI。我已经更新了下面的代码。
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()
}
推荐阅读
- javascript - 如何在 Firebase 分析中禁用自动 page_view 日志记录
- c# - 在不同项目中使用模型进行 EF 迁移
- android - 在我上传我的 apk 进行封闭测试后,有没有办法更改包名称?
- javascript - 滚动正在跳过标题并从正文开始
- python - 命令提示符和 Powershell 无法识别任何命令
- json - Kotlinx 序列化:如何绕过 reified typeargs 进行反序列化?
- django - Django-allauth 创建自定义注册表单
- r - 在 R 中使用 select_if 中的函数子集数据帧以使其以分组变量为条件?
- java - Java 等效的 PHP 代码返回不同的 base 64 编码结果
- swift - 表单值更新时使用 Combine + SwiftUI 来更新值