SwiftUI 列表和 URLSession + JSONDecode
SwiftUI List and URLSession + JSONDecode
大家好我是Swift的新手
求助为什么数据没有显示在List中?请帮我修复它。
我制作了一个模型数据,并从 URl 中获取数据并解析它
我的模型:
struct ResponseData: Codable{
var userId: String
var id: String
var title: String
var body: String
}
我在内容视图中的代码:
import SwiftUI
struct ContentView: View {
@State var responseData = [ResponseData]()
var body: some View {
List(responseData, id: \.id ) { item in
Text("\(item.body)")
}
.task {
await loadData()
}
}
func loadData () async {
let urlString = "https://jsonplaceholder.typicode.com/posts"
guard let url = URL(string: urlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {return}
guard error == nil else {return}
do {
let postData = try JSONDecoder().decode(ResponseData.self, from: data)
} catch let error {
print(error)
}
}.resume()
}
}
代码中有很多问题。
最重要的是
- 在结构中
userId
和 id
是 Int
。
- JSON根对象是一个数组,请注意起始
[
.
- 您没有在收到数据后更新模型。
当你使用 async/await 时,无论如何都要 充分利用 模式。
JSONAPIreturnsposts,那么如何命名结构体Post
?
struct Post: Codable, Identifiable {
let userId: Int
let id: Int
let title: String
let body: String
}
struct ContentView : View {
@State var posts = [Post]()
var body : some View {
List(posts) { post in
Text(post.body)
}
.task {
do {
posts = try await loadData()
} catch {
print(error)
}
}
}
func loadData() async throws -> [Post] {
let urlString = "https://jsonplaceholder.typicode.com/posts"
let url = URL(string: urlString)!
let (data, _) = try await URLSession.shared.data(for: URLRequest(url: url))
return try JSONDecoder().decode([Post].self, from: data)
}
}
大家好我是Swift的新手 求助为什么数据没有显示在List中?请帮我修复它。 我制作了一个模型数据,并从 URl 中获取数据并解析它
我的模型:
struct ResponseData: Codable{
var userId: String
var id: String
var title: String
var body: String
}
我在内容视图中的代码:
import SwiftUI
struct ContentView: View {
@State var responseData = [ResponseData]()
var body: some View {
List(responseData, id: \.id ) { item in
Text("\(item.body)")
}
.task {
await loadData()
}
}
func loadData () async {
let urlString = "https://jsonplaceholder.typicode.com/posts"
guard let url = URL(string: urlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {return}
guard error == nil else {return}
do {
let postData = try JSONDecoder().decode(ResponseData.self, from: data)
} catch let error {
print(error)
}
}.resume()
}
}
代码中有很多问题。
最重要的是
- 在结构中
userId
和id
是Int
。 - JSON根对象是一个数组,请注意起始
[
. - 您没有在收到数据后更新模型。
当你使用 async/await 时,无论如何都要 充分利用 模式。
JSONAPIreturnsposts,那么如何命名结构体Post
?
struct Post: Codable, Identifiable {
let userId: Int
let id: Int
let title: String
let body: String
}
struct ContentView : View {
@State var posts = [Post]()
var body : some View {
List(posts) { post in
Text(post.body)
}
.task {
do {
posts = try await loadData()
} catch {
print(error)
}
}
}
func loadData() async throws -> [Post] {
let urlString = "https://jsonplaceholder.typicode.com/posts"
let url = URL(string: urlString)!
let (data, _) = try await URLSession.shared.data(for: URLRequest(url: url))
return try JSONDecoder().decode([Post].self, from: data)
}
}