Home > OS >  I can't display String from API to View
I can't display String from API to View

Time:06-21

I tried to store the text in a variable of API in the class I do not want to transfer the entire model, I want to transfer the text as it is here

class Api : ObservableObject{

@Published var title : String = ""
@Published var details : String = ""

func getDataModelApi () {
    
    guard let url = URL(string: APIgetURL.demo) else { return }
    var request = URLRequest(url: url)
    let token = "38|xxxxx"
    
    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)
            
            for i in dataModel {
                
                DispatchQueue.main.async {
                    
                    self.title = i.title
                    self.details = i.details
                }
            }
        } catch {
            print("error: ", error)
        }
    }
    .resume()
}
}

In the title variable, the value was stored successfully, but the display in the view does not get anything

struct ContentView: View {

@StateObject var model3 = Api()

var body: some View {
    
    VStack {
        Text(model3.title)
    }

    .onAppear() {
       
        Api().getDataModelApi()
    }
}
}

Here in getData, it shows the complete model and needs a link, which I want to access from getDataModelApi

@Published var models : [model] = []

func getData (url : String) {
    
    guard let url = URL(string: url) else { return }
    var request = URLRequest(url: url)
    let token = "38|xxx"
    
    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
                
            }
        } catch {
            print("error: ", error)
        }
    }
    .resume()
}

CodePudding user response:

You are using two different instances of Api and you throw away the second one in onAppear.

Replace

.onAppear() {
    Api().getDataModelApi()
}

With

.onAppear() {
    model3.getDataModelApi()
}
  • Related