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
didSet
和 wilSet
前(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:为啥调用闭包函数到晚的主要内容,如果未能解决你的问题,请参考以下文章
为啥没有通过在 promise 中调用的函数内部的闭包来定义解析?