为什么完成处理程序没有 return 任何东西?

Why does the completion handler does not return anything?

所以,我有一个 json get 请求,它获取 class Horse 的所有 horse 对象。这成功了。我有一个完成处理程序,它应该让我在调用 getHorses 请求的另一个视图中再次使用 horses 对象,但是当我尝试将这些对象放入另一个数组时,它不会附加它们。为什么会这样?

这是我的代码:

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。

我已经用 (JSON 和实现)测试了你的代码,首先,我建议使用这个:

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

你应该为 UITableViewDelegate, UITableViewDataSource 准备逻辑(tableView 取决于你的数组,你设置 numberOfRowsInSection 就像 self.horses.count 等等)并设置你的数据table查看一些变量(就像你所做的那样 - self.horses 它是全局的 var horses = [Horse]())并调用它:

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

就是这样。我已经检查过了,这就足够了。小心 - 你应该在收到数据

后重新加载 table