Home > Back-end >  Loading JSON Data using SwiftUI
Loading JSON Data using SwiftUI

Time:02-01

struct ApiModel : Hashable ,Codable{

    var results : [MovieData]
}

struct MovieData : Hashable, Codable{

    var backdrop_path : String?
    var original_title : String
    var poster_path : String?
    var overview : String
    var vote_average : Float
}

I have a problem in below line, since this is a published property I need to initialise it in accordance to the ApiModel, but I don't know how to

class ApiViewModel: ObservableObject{
    
    @Published var movies: ApiModel =  
    

    func fetchData(){
        
        guard let url = URL(string: urlLink) else {return}
        
        URLSession.shared.dataTask(with: url) { data, response, error  in
            
            guard let data = data, error == nil else {return}
                                    
            do {
                
                let movies = try JSONDecoder().decode([ApiModel].self, from: data)
                DispatchQueue.main.async {
                    
                    self.movies = movies
                    
                    //print(movies[0].original_title)
                }
            }
            
            catch{
                print("error found \(error.localizedDescription)")
            }
 
            
        }.resume()    
    }
}

CodePudding user response:

struct ApiModel : Hashable ,Codable{

var results : [MovieData]
}

struct MovieData : Hashable, Codable{

var backdrop_path : String?
var original_title : String
var poster_path : String?
var overview : String
var vote_average : Float
}


class ApiViewModel: ObservableObject{

@Published var movies = [ApiModel]()

func fetchData(urlLink: String){
    
    guard let url = URL(string: urlLink) else {return}
    
    URLSession.shared.dataTask(with: url) { data, response, error  in
        
        guard let data = data, error == nil else {return}
                                
        do {
            
            let movies = try JSONDecoder().decode([ApiModel].self, from: data)
            DispatchQueue.main.async {
                
                self.movies = movies
                
                print(movies[0].results[0].original_title)
                      }
        }
        
        catch{
            print("error found \(error.localizedDescription)")
        }

        
    }.resume()
}
}

CodePudding user response:

Change the declaration of the published property to

 @Published var movies: [MovieData] = []

since you don’t really need the whole ApiModel and then in fetchData do

self.movies = movies.reults

I assume your decoding code is incorrect and should be

let movies = try JSONDecoder().decode(ApiModel.self, from: data)
  •  Tags:  
  • Related