Why does the completion handler does not return anything?

落爺英雄遲暮 提交于 2020-01-30 13:18:47

问题


So, I have a json get request which gets all horse objects of class Horse. This works successfully. I have a completion handler which is supposed to let me use the horses object again in another view where I call the getHorses request but when I try to get those objects into another array it does not append them. Why is that the case?

Here is my code:

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")

      }
  }

Here I use the function:

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")

THe horses array is 0 even when I try to append the horses to it.


回答1:


I've tested your code with previous data (JSON and implementation) and first of all, I'd recommend use this:

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

you should prepare you logic for UITableViewDelegate, UITableViewDataSource (tableView depends on your array and you set numberOfRowsInSection like self.horses.count and etc.) and set your data for tableView in some variable (as you did - self.horses where it is global var horses = [Horse]()) and just call this:

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

that's all. I've checked and it's enough. And be careful - you should reload the table after receiving the data



来源:https://stackoverflow.com/questions/59861392/why-does-the-completion-handler-does-not-return-anything

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!