Swift:为啥调用闭包函数到晚

Posted

技术标签:

【中文标题】Swift:为啥调用闭包函数到晚【英文标题】: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 中使用闭包来管理它们。 【参考方案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]

【讨论】:

以上是关于Swift:为啥调用闭包函数到晚的主要内容,如果未能解决你的问题,请参考以下文章

Swift函数和闭包

为啥没有通过在 promise 中调用的函数内部的闭包来定义解析?

闭包中的Swift可变结构和结构的行为不同

Swift学习笔记-函数和闭包

iOS开发-Swift进阶之闭包,逃逸闭包 & 非逃逸闭包!

Swift进阶六——函数和闭包