代码之家  ›  专栏  ›  技术社区  ›  Badrshammry

在API中存储传入数据的数量

  •  0
  • Badrshammry  · 技术社区  · 2 年前

    在迅捷

    我试图计算API中的数据数量 在视图上显示

    当我打印变量时 @Published var counts = 0 在同一个类中,我看到来自API的值已被保存

    但当它显示在视图上时,会出现默认值

    我在传输数据的方法上是否有错误,或者是否存在其他问题?

    class Api : ObservableObject{
    
    @Published var counts = 0
    
    func getData(complation: @escaping ([model]) -> ()) {
        
        guard let url = URL(string: "https://XXXXXX") else { return }
        let token = "28|cSXXXXXX"
        var request = URLRequest(url: url)
        
        request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
        
        URLSession.shared.dataTask(with: request) { data, responce, err in
            
            guard let data = data else { return }
    
            do {
                let dataModel = try JSONDecoder().decode([model].self, from: data)
    
                self.counts = dataModel.count
                
                DispatchQueue.main.async {
                    complation(dataModel)
                    
                }
            } catch {
                print("error: ", error)
            }
        }
        .resume()
    }
    }
    

    这里是风景

    import SwiftUI
    
    struct Tap1Section1: View {
    
    
    @ObservedObject var countid = Api()
    @State var modelname : [model] = [model(title: "")]
    
    var body: some View {
        
        VStack {
    
            ForEach(modelname) { item in
               
                Text("\(countid.counts)")
            }
        }
        .onAppear {
            Api().getData { item in
                self.modelname = item
            }
        }
    }
    }
    
    1 回复  |  直到 2 年前
        1
  •  2
  •   workingdog support Ukraine    2 年前

    您可以尝试以下替代方法来获取模型数量:

    struct Tap1Section1: View {
        
        @StateObject var viewModel = Api() // <-- here
        
        var body: some View {
            VStack {
                Text("\(viewModel.models.count)")  // <-- here
                ForEach(viewModel.models) { item in  // <-- here
                    Text(item.title)  // <-- here
                }
            }
            .onAppear {
                viewModel.getData()
            }
        }
    }
    
    //  -- here
    struct Model: Identifiable, Decodable {
        let id = UUID()
        var title: String
    }
    
    class Api: ObservableObject {
        
        @Published var models: [Model] = []  // <-- here
        
        func getData() {
            guard let url = URL(string: "https://XXXXXX") else { return }
            let token = "28|cSXXXXXX"
            var request = URLRequest(url: url)
            request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
            URLSession.shared.dataTask(with: request) { data, responce, err in
                guard let data = data else { return }
                do {
                    let dataModel = try JSONDecoder().decode([Model].self, from: data)
                    DispatchQueue.main.async {
                        self.models = dataModel  // <-- here
                    }
                } catch {
                    print("error: ", error)
                }
            }
            .resume()
        }
    }