Почему обработчик завершения ничего не возвращает? - PullRequest
0 голосов
/ 22 января 2020

Итак, у меня есть json запрос на получение, который получает все объекты лошади класса Horse. Это успешно работает. У меня есть обработчик завершения, который должен позволить мне снова использовать объект лошадей в другом представлении, где я вызываю запрос getHorses, но когда я пытаюсь получить эти объекты в другой массив, он не добавляет их. Почему это так?

Вот мой код:

func getJSONHorses (completion: @escaping ([Horse])->[Horse]) { //Message<[Horse]>
          let url = "http://localhost:8083/horses"
      if let url = URL(string: url)
      {
          let task = session.dataTask(with: url) { data, response, error in

                    if error != nil || data == nil {
                        print("Client error!")
                        return
                    }
              let str = String(decoding: data!, as: UTF8.self)
              print(str)
                    do {
                     print("nothing")

                      let json = try JSONDecoder().decode(Message<[Horse]>.self, from: data!)

                        print(json.model?.count as Any)
                     // print(json.model as Horse)
                    //  print(json.self.model)
                    //  print(json.model)

                      print(json.model as Any)
                      print("something")
                        completion(json.model!)


                    } catch {
                        print("JSON error: \(error)")
                      print("erroooorrrrrr")
                    }
                }

                task.resume()
          print("finished")

      }
  }

Здесь я использую функцию:

print("Startttt")
    backEnd.getJSONHorses(completion:{(horse) in
            for h in horse {
                self.horses.append(h)
            }
        print(horse.count)
           self.horses = horse
            //print(horse.count as Any
            return horse
        })

    print(horses.count)
    print("END")

Массив лошадей равен 0, даже когда я пытаюсь добавить лошадей к нему.

1 Ответ

1 голос
/ 22 января 2020

Я протестировал ваш код с предыдущими данными (JSON и реализацией) и, прежде всего, я бы порекомендовал использовать это:

func getJSONHorses(completion: @escaping([Horse]) -> Void)

вы должны подготовить вас logi c для UITableViewDelegate, UITableViewDataSource (tableView зависит от вашего массива, и вы устанавливаете numberOfRowsInSection как self.horses.count и т. д. c.) и задаете ваши данные для tableView в некоторой переменной (как вы это сделали - self.horses, где она является глобальным var horses = [Horse]()) и просто назовите это:

backEnd.getJSONHorses(completion:{ horse in
    print(horse.count)
    self.horses = horse
    self.tableView.reload()
})

и все. Я проверил, и этого достаточно. И будьте осторожны - вы должны перезагрузить таблицу после получения данных

...