Swift:为什么关闭函数被调用到很晚

时间:2018-04-04 09:17:22

标签: ios json swift parsing closures

我有两个功能:

class ProductController: NSObject {

    var products = [Product]()

    func getData(){

        let json = JSONParser()
        let path = "http://localhost:8888/myApi/product/read.php"

        json.getRequest(url: path) { (products) in
            self.products = products
            print("closure")
            print(self.products)
        }
    }

    func getPr() -> [Product]{
        return self.products
    }
}

我正在打电话:

 let pc = ProductController()
 pc.getData()
 print(pc.getPr())

pc.getData()的来电始终是最后一次,所以我从[]获得pc.getPr()。如何在致电getData()之前从getPr()获取产品?

2 个答案:

答案 0 :(得分:1)

您可以尝试完成

func getData(completion: @escaping (_ anyData: [Product]) -> Void) {
  let json = JSONParser()
  let path = "http://localhost:8888/myApi/product/read.php"

  json.getRequest(url: path) { (products) in
  self.products = products
  print("closure")
  print(self.products)
  completion(products)

}

并像这样称呼它

pc.getData() { products in

    print(products)
    print(pc.getPr())
}

答案 1 :(得分:0)

当您执行HTTPRequest任务时,您的设备向您的服务器发送请求,然后设备等待服务器响应,同时服务器接收您的请求,处理并为您准备数据,之后它会向您发送响应和数据。因此,在您提出要求后,需要一些时间才能得到答复,而您永远不知道确切的时间 每当你在获得Response之后需要做一些任务时,你应该在完成处理程序中定义你的任务@Sh_Khan所说的。

除此之外,如果您想在变量数据更改后执行某些操作,可以使用Swift Property observers didSetwilSet
EX(iswift.org):

var a : [Int] = [0,1,4]{
didSet{
    print(a)
}
}
a = [10, 20, 30]
a.append(60)

输出:
[10, 20, 30] [10, 20, 30, 60]