Обновление списка после запроса HTTP POST в SwiftUI - PullRequest
0 голосов
/ 29 марта 2020

Я хочу добавить объект на локальный сервер и затем увидеть обновленный список в моем представлении.

У меня есть ViewModelClass , который обрабатывает запросы REST:

class CupcakeViewModel : ObservableObject {

    let objectWillChange = PassthroughSubject<CupcakeViewModel,Never>()

    init() {
        get()
    }

    var cupcakes : [Cupcake] = [Cupcake]() {
        didSet {
            objectWillChange.send(self)
        }
    }

    static let url = URL(string: "http://localhost:1337/cupcakes")!

    func get() {
        URLSession.shared.dataTask(with: CupcakeViewModel.url) { (data, response, error) in
            if let data = data {
                do {
                    print(data)
                    let cupcakes = try JSONDecoder().decode([Cupcake].self, from: data)
                    DispatchQueue.main.async {
                        self.cupcakes = cupcakes
                    }
                } catch {
                    print("ERROR")
                }
            }
        }.resume()
    }

    func post(cupcake : Cupcake) {
        AF.request(CupcakeViewModel.url, method: .post, parameters: cupcake, encoder: JSONParameterEncoder.default).responseDecodable {  (response: DataResponse<Cupcake, AFError>) in
            if let value = response.value {
                DispatchQueue.main.async {
                    self.cupcakes.append(value)
                }
            }
        }
    }

}

и в моем MainView у меня есть:

struct CupcakesView: View {

    @ObservedObject var VM = CupcakeViewModel()
    @State var showed = false

    var body: some View {

        NavigationView {
            List(VM.cupcakes,id:\.self) {cupcake in
                Text(cupcake.gusto)
            }.padding(.top,1)
                .sheet(isPresented: $showed, content: {
                    AggiungiCupcake(showed: self.$showed)
                })
            .navigationBarItems(trailing:
                Button(action: {
                    self.showed = true
                }) {
                    Text("ADD")
                }
            )
        }
    }
}

struct AggiungiCupcake : View {

    @State var gusto = ""
    @State var prezzo : Float = 0
    @Binding var showed : Bool
    @ObservedObject var VM = CupcakeViewModel()

    var body : some View {
        VStack {
            TextField("Gusto", text: $gusto)
            TextField("Prezzo", value: $prezzo, formatter: NumberFormatter())
            Button(action: {
                let c = Cupcake(gusto: self.gusto, prezzo: self.prezzo)
                self.VM.post(cupcake: c)
                self.showed = false
            }) {
                Text("ADD")
            }
        }.padding(30)
    }
}

И запросы get, и post go нормально и на моем сервере все обновляется, но мое представление не меняется добавьте новый объект в список. Я использую AlamoFire (AF) для почтового запроса.

Кто-нибудь может помочь?

...