Home > Back-end >  Store the number of incoming data in API
Store the number of incoming data in API

Time:05-08

in SwiftUI

I'm trying to count the number of data in API To display on the View

When I print a variable @Published var counts = 0 in the same class, I see that the value coming from API has been saved

But when it is displayed on the View comes the default value

Do I have an error in the method of transferring data or is there something else?

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()
}
}

here view

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
        }
    }
}
}

CodePudding user response:

you could try the following alternative approach to get the count of your models:

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()
    }
}
  • Related