【问题标题】:SwiftUI List and URLSession + JSONDecodeSwiftUI 列表和 URLSession + JSONDecode
【发布时间】:2022-01-03 23:25:31
【问题描述】:

大家好,我是 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()
        
    }
}

【问题讨论】:

    标签: json swiftui swiftui-list


    【解决方案1】:

    代码有很多问题。

    最重要的是

    • 在结构userIdid 中是Int
    • JSON 根对象是一个数组,请注意开头[
    • 收到数据后不更新模型。

    当您使用 async/await 时,请充分利用该模式。

    JSON API 返回posts,那么如何将结构命名为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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 2020-09-19
      • 2021-07-30
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      相关资源
      最近更新 更多