Вызов функции Parse Json из контроллера представления в другое представление - PullRequest
0 голосов
/ 29 мая 2018

Я бы вызвал функцию из контроллера вида в другом контроллере вида.Эта функция будет анализировать json и помещать данные в массив, который является глобальным в структуре, проблема в том, что, если я помещу функцию в ViewDidAppear, она сделает большое количество запросов к веб-службе, если я помещу функцию в ViewDidLoadон не будет загружать данные, это моя функция, которую я бы назвал

@objc func pazienti(completionHandler: @escaping () -> Void) {

    let endpoint = MyStruct.endpointpazienti()
    ArrayGlobale.listapazienti.removeAll()
    guard let url = URL(string: endpoint) else {
        print("Error: cannot create URL")
        let error = BackendError.urlError(reason: "Could not construct URL")
        completionHandler()
        //
        return
    }
    let urlRequest = URLRequest(url: url)

    let session = URLSession.shared

    let task = session.dataTask(with: urlRequest) {
        (data, response, error) in
        guard data != nil else {
            //self.updateUserInterface()
            print("Error: did not receive data")
            completionHandler()
            return
        }
        guard error == nil else {
            completionHandler()
            return
        }

        //            let decoder = JSONDecoder()
        //            do {
        //                let todos = try decoder.decode([MyStruct].self, from: responseData)
        //                completionHandler(todos, nil)
        //            } catch {
        //                print("error trying to convert data to JSON")
        //                print(error)
        //                completionHandler(nil, error)
        //            }
        do
        {
            let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [[String:Any]] ?? []
            print(json)
            for x in json
            {
                print(x["nome"]!)
                 ArrayGlobale.listapazienti.append(ListaPazienti(nome: x["nome"] as! String, cognome: x["cognome"] as! String, id : x["id"] as! String, data : x["data"] as! String, sesso : x["sesso"] as! String))

                //print(ArrayGlobale.listapazienti)
                //sleep(4)
            }

        }catch
        {

        }
    }
    task.resume()
    ArrayGlobale.action = completionHandler

}

, чтобы вызвать эту функцию, self.pazienti {}, но я пытаюсь создать класс extends с глобальной функцией, и это сделаетнекоторые запросы, блокирующие сервер.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вы не показываете нам ни одного кода, который мог бы вызвать проблему.Если вы выберете viewDidAppear, вам может потребоваться ввести какое-то состояние, чтобы узнать, выполняется ли запрос уже (и не планировать другое dataTask, если оно есть).С другой стороны, ваш viewDidLoad должен делать то, что вам нужно, он должен вызываться только один раз.

Однако весьма вероятно, что это не просто плохая, а действительно плохая идея хранить ваш завершающий_хандлер в некоторой глобальной переменной, если только действительно не существует другого решения.для этого.Насколько я могу судить по дизайну вашего func pazienti, он, похоже, находится внутри «неправильного» объекта.Однако вы предоставляете немного кода, чтобы действительно судить об этом.Пожалуйста, добавьте хотя бы ваш код обратного вызова к вопросу, чтобы я мог изменить свой ответ.

0 голосов
/ 29 мая 2018

Вы должны создать одноэлементный класс и поместить свой метод в этот одноэлементный класс.тогда вы можете вызвать этот метод как

yourclass.sigleton.pazienti()
...