【问题标题】:Swift: why closure function is called to lateSwift:为什么调用闭包函数到晚
【发布时间】:2018-04-04 09:17:21
【问题描述】:

我有两个功能:

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() 得到[]。在致电getPr() 之前,如何从getData() 获得产品?

【问题讨论】:

  • 你注意到它被称为“为时已晚”,这是许多新人不知道的一点。现在,您缺少的概念是“异步”。关于 SO 有很多问题,如何在 Swift 中使用闭包来管理它们。

标签: ios json swift parsing closures


【解决方案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())
}

【讨论】:

  • 我可以通过简单地调用来做到这一点: json.getRequest(url: path) { (products) in self.products = products print("closure") print(self.products) } 我只想当我调用 getData() 时,在实例变量 self.products 中分配结果产品
  • 代码已经这样做了,但是在完成完成之前你不能使用它的值这是一个异步调用
  • 我这样做了: let pc = ProductController() pc.getData(completion: {products in print() }) print(pc.getPr()) getPr() 仍然在 getData( )
【解决方案2】:

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

除此之外,如果您想在变量数据更改后做某事,您可以使用Swift Property observers didSetwilSet
前(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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    相关资源
    最近更新 更多