1

I want to add a Button to my view to load more data. In my Environment Object the data is generated randomly via an API. How can I reload my Environment object to get new items. The Code Below should make it clear. Thanks in advance


class observer : ObservableObject{
    @Published var shows = [stacks]()
 
    @Published var last = -1
    var results = [Result1]()
    init(){
        let number = Int.random(in: 1...35)
        print("das ist dier etste radodm nube: \(number)")

        let endnumber = number + 8
        print("das ist dier etste radodm nube: \(endnumber)")
                for n in number...endnumber{

                guard let url = URL(string:"https://api.themoviedb.org/3/discover/tv?api_key=3ed2bd15f916d0e3fbb77c193bf33b61&language=de-DE&region=DE&with_networks=213&page=\(n)" ) else {
                    print("Invalid URL")
                    return
                }
                let request = URLRequest(url: url)
                URLSession.shared.dataTask(with: request) { data, response, error in
        
                    if let data = data {
        
                        if let decodedResponse = try? JSONDecoder().decode(Response.self, from: data) {
        
                            DispatchQueue.main.async {
        
                                self.results = decodedResponse.results
                                for i in self.results{
                                    self.shows.append(stacks(id: "\(i.id)", name: i.name, typ: "Serie", status: "",overview: i.overview, vote: "\(i.vote_average)", image: i.poster_path, swipe: 0, degree: 0, commercal: "no"))
                                }
                                self.shows.shuffle()
                            }
                            return
                        }
                    }
                    print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")")
                    }.resume()
                }
     } 
}


struct View: View {
    @EnvironmentObject var cards : observer
    
    var body: some View {
              VStack{
            Button(action: {
               //reload
            }){
             Text("reload")
            }
        }
pawello2222
  • 46,897
  • 22
  • 145
  • 209
Tobi.M
  • 17
  • 3

1 Answers1

1

I would put the fetching/loading data code that is inside the init in a function.

func codeToFetchData() {
    //Code from your init
}

The call that method in your init and your Button for example cards.codeToFetchData()

lorem ipsum
  • 21,175
  • 5
  • 24
  • 48