【发布时间】:2021-06-24 23:44:05
【问题描述】:
尝试读取此 JSON 数据:
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
但我的应用程序不断崩溃,我很难理解原因(对于 swift 来说还是相当新的)。我认为数据存储在字典中,我只是处理不正确。有人可以解释一下解码这个 JSON 的正确方法以及我将如何在视图上显示它吗?我尝试用 JSONSerialization 代替 JSONDecoder,但得到了相同的结果,所以不确定这是否是正确的方向。
型号:
struct Model: Codable{
var userId: Int? = nil
var id: Int? = nil
var title: String? = nil
var completed: Bool? = nil
enum CodingKeys: CodingKey{
case userId, id, title, completed
}
}
JSON 加载函数:
func loadData(){
let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")!
//create url request
var request = URLRequest(url: url)
//specify the method to use
request.httpMethod = "GET"
//set HTTP request Header, can set more than one.
request.setValue("application/json", forHTTPHeaderField: "Accept")
//send the request
let dataTask = URLSession.shared.dataTask(with: request){ data, response, error in
if let data = data{
if let users = try? JSONDecoder().decode(Model.self, from: data){
DispatchQueue.main.async {
self.dataInfo = users
}
}else{
print("Data Not Got")
}
}
if let response = response{
print("Response Got")
}
if let error = error{
print("\(error)")
}
}
dataTask.resume()
}
Swift UI 视图:
struct ContentView: View {
@State var dataInfo = Model()
var body: some View {
VStack{
Button("Go"){
loadData()
}
Text(dataInfo.title!)
}
【问题讨论】:
-
您不应执行以下操作。 DispatchQueue.main.async {self.dataInfo = users}
-
哦,谢谢你告诉我。你会建议做什么更好?