Данные не отображаются при первом нажатии кнопки - PullRequest
0 голосов
/ 18 июня 2019

Мое приложение декодирует некоторые данные JSON из веб-службы PHP, но эти данные не отображаются на ярлыках, когда я впервые нажимаю кнопку выборки.

В режиме отладки я вижу, что данныепередан в массив, но не передан меткам в контроллере представления.

Не могли бы вы помочь мне в этом?

Заранее спасибо,

Adelmo

Нажатие кнопки

@IBAction func btn_ler(_ sender: Any)
    {

        //txt_matricula.text = ""
        //txt_marca.text = ""
        //txt_modelo.text = ""

        obter_dados_veiculo(matricula: input_matricula.text!)

        for veiculo in a_veiculos
        {
            txt_matricula.text = veiculo.MATRICULA
            txt_modelo.text = veiculo.MODELO
            txt_marca.text = veiculo.MARCA
        }

        //lbl_num_servicos.text = String( a_veiculos.count)
    }

Функция для извлечения JSON

func obter_dados_veiculo (matricula : String)
    {
        //Variável que vai conter o URL
        let v_url = "http://arshome.hopto.org/Domingues/DEV/api_get_veiculos.php?MATRICULA=" + matricula

        let o_url = URL(string: v_url)

        URLSession.shared.dataTask(with: o_url!)
        {
            (data, response, error) in

            do
            {
                let matriculas = try JSONDecoder().decode([s_veiculo].self, from: data!)


                //for matricula in matriculas
                //{
                    //print(matricula.MATRICULA)
                a_veiculos = []
                    a_veiculos.append(contentsOf: matriculas)
                //}
            }
            catch
            {
                print("We have an error!")
                //self.txt_matricula.text = "We have an error!"
            }
            print( a_veiculos.count)
            }.resume()
    }

Ответы [ 4 ]

1 голос
/ 18 июня 2019

Ваша проблема в том, что вы выполняете асинхронный сетевой запрос, то есть не гарантируется, что к тому времени, когда вы назначаете текст меткам, сетевой ответ получен.

    obter_dados_veiculo(matricula: input_matricula.text!)

    //RESPONSE MAY NOT BE RECEIVED

    for veiculo in a_veiculos
    {
        txt_matricula.text = veiculo.MATRICULA
        txt_modelo.text = veiculo.MODELO
        txt_marca.text = veiculo.MARCA
    }

Один из вариантов, который выможно добавить наблюдателя свойства к a_veiculos , например:

var a_veiculos: [s_veiculo] = [] {
    didSet {
        for veiculo in a_veiculos
          {
             txt_matricula.text = veiculo.MATRICULA
             txt_modelo.text = veiculo.MODELO
             txt_marca.text = veiculo.MARCA
          }
    }
}
1 голос
/ 18 июня 2019

Вы должны добавить завершение closure в вашем obter_dados_veiculo методе, как показано ниже:

func obter_dados_veiculo (matricula : String, completion:@escaping(Bool,Error?)->())
{
    //Variável que vai conter o URL
    let v_url = "http://arshome.hopto.org/Domingues/DEV/api_get_veiculos.php?MATRICULA=" + matricula

    let o_url = URL(string: v_url)

    URLSession.shared.dataTask(with: o_url!)
    {
        (data, response, error) in

        do
        {
            let matriculas = try JSONDecoder().decode([s_veiculo].self, from: data!)


            //for matricula in matriculas
            //{
            //print(matricula.MATRICULA)
            a_veiculos = []
            a_veiculos.append(contentsOf: matriculas)
            completion(true,nil)
            //}
        }
        catch let error as NSError
        {
            print("We have an error!")
            completion(false,error)
            //self.txt_matricula.text = "We have an error!"
        }
        print( a_veiculos.count)
        }.resume()
}

И назовите это как показано ниже:

@IBAction func btn_ler(_ sender: Any)
{

    //txt_matricula.text = ""
    //txt_marca.text = ""
    //txt_modelo.text = ""

    obter_dados_veiculo(matricula: input_matricula.text!) { (success, error) in
        for veiculo in self.a_veiculos
        {
            txt_matricula.text = veiculo.MATRICULA
            txt_modelo.text = veiculo.MODELO
            txt_marca.text = veiculo.MARCA
        }
    }

    //lbl_num_servicos.text = String( a_veiculos.count)
}
0 голосов
/ 18 июня 2019

Используйте обработчик завершения, чтобы вы получали обновление, когда ваш вызов API завершается.И обновите пользовательский интерфейс соответственно.Вот как вы можете использовать обработчик завершения.

@IBAction func btn_ler(_ sender: Any)
{

    obter_dados_veiculo(matricula: input_matricula.text!) {
        DispatchQueue.main.async {
            for veiculo in a_veiculos
            {
                txt_matricula.text = veiculo.MATRICULA
                txt_modelo.text = veiculo.MODELO
                txt_marca.text = veiculo.MARCA
            }
        }
    }
}

func obter_dados_veiculo (matricula : String, completionHandler: @escaping () -> Void) {
    //Variável que vai conter o URL
    let v_url = "http://arshome.hopto.org/Domingues/DEV/api_get_veiculos.php?MATRICULA=" + matricula
    let o_url = URL(string: v_url)
    URLSession.shared.dataTask(with: o_url!) {
        (data, response, error) in
        do {
            let matriculas = try JSONDecoder().decode([s_veiculo].self, from: data!)
            a_veiculos = []
            a_veiculos.append(contentsOf: matriculas)
        }
        catch {
            print("We have an error!")
            //self.txt_matricula.text = "We have an error!"
        }
        print( a_veiculos.count)
        }.resume()
}
0 голосов
/ 18 июня 2019

Напишите другой метод initializeData () следующим образом.

 func initializeData() {
   for veiculo in a_veiculos
    {
        txt_matricula.text = veiculo.MATRICULA
        txt_modelo.text = veiculo.MODELO
        txt_marca.text = veiculo.MARCA
    }

 }

И вызовите этот метод при инициализации массива.

 func obter_dados_veiculo (matricula : String)
     {
    //Variável que vai conter o URL
    let v_url = "http://arshome.hopto.org/Domingues/DEV/api_get_veiculos.php?MATRICULA=" + matricula

    let o_url = URL(string: v_url)

    URLSession.shared.dataTask(with: o_url!)
    {
        (data, response, error) in

        do
        {
            let matriculas = try JSONDecoder().decode([s_veiculo].self, from: data!)


            //for matricula in matriculas
            //{
                //print(matricula.MATRICULA)
            a_veiculos = []
                a_veiculos.append(contentsOf: matriculas)
          initializeData()
            //}
        }
        catch
        {
            print("We have an error!")
            //self.txt_matricula.text = "We have an error!"
        }
        print( a_veiculos.count)
        }.resume()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...