0
votes

I am new to SwiftUI and Swift . I got a Search Bar and a Listview whenever a user types something in the searchbar I do an http request and new data comes in . The issue is that the list is not updating with the new data and I think I know why . I need to pass my SearchBar response into the ObservedObject variable . I was reading this swiftui ObservedObject function call in all view however I still didn't find my answer . This is my code

struct RegistrationView: View {

    @State private var searchTerm: String = ""
    @State var txt = "" // Txt has the SearchBar text
    @ObservedObject var getData = datas(location: "") // I need to pass it here

    var body: some View {
        VStack {

            Text("Registration")
            searchView(txt: $txt)
        // datas(location: txt) 
            NavigationView {
                List(getData.jsonData.filter{ txt == "" ? true : $0.name.localizedCaseInsensitiveContains(txt)}) { i in
                    ListRow(name: i.name,statelong: i.statelong)

                }

            }
            .padding(.top, 5.0)

        }

    }
}

class datas: ObservableObject
{
    @Published var jsonData = [datatype]()

    init(location: String) {

        let session = URLSession(configuration: .default)
        if location == "" {
            return
        }
        let parameter = "location=\(location)"
       if location == "" {
            return
        }
            let url = URL(string:"url")!
            let request = RequestObject(AddToken: true, Url: url, Parameter: parameter)
            session.dataTask(with:request, completionHandler: {(data, response, error) in
            do
            {
                if data != nil
                {
                let fetch = try JSONDecoder().decode([datatype].self, from: data!)
                DispatchQueue.main.async {
                    self.jsonData = fetch
                    print(fetch) 
                }
            }
            }
            catch
            {
                print(error.localizedDescription)
            }


        }).resume()
        }

    }

In the above code I want to pass in the txt variable into the getData variable or do something like this @ObservedObject var getData = datas(location: txt) . When the SearchBar is updated then txt gets whatever is inserted into the SearchBar .

If I do something like this

@ObservedObject var getData = datas(location: "Me")

Then the list will update and correctly have everything that starts with Me my only issue is getting the SearchBar value inside datas so I don't have to hardcode things . As stated before I need to pass in txt to datas . Any help would be great

1

1 Answers

0
votes

You don't need to init the class with that variable. You can just make a function for that and fetch it when ever you need. It could be just once.

class datas: ObservableObject {
    @Published var jsonData = [datatype]()

    func get(location: String) {
        let session = URLSession(configuration: .default)
        guard !location.isEmpty else { return }
        let parameter = "location=\(location)"
        let url = URL(string:"url")!
        let request = RequestObject(AddToken: true, Url: url, Parameter: parameter)
        session.dataTask(with:request, completionHandler: {(data, response, error) in
            do {
                guard data != nil else { return }
                let fetch = try JSONDecoder().decode([datatype].self, from: data!)
                DispatchQueue.main.async {
                    self.jsonData = fetch
                    print(fetch)
                }
            } catch {
                print(error.localizedDescription)
            }
        }).resume()
    }
}