在函数返回后调用转义闭包是什么意思?

我正在阅读apple developer文档中关于转义闭包的定义。 它说“当一个闭包被作为参数传递给函数时,一个闭包被称为转义函数,但在函数返回后被调用”

我不确定最后一部分是什么意思,“函数返回后”是什么意思? 这是否意味着“函数返回值后”?

例如,调用API。 这个电话需要花费时间,但我们打算在通话完成后做一些事情。 例如,假设我们想要使用我们提取的新数据刷新UITableView。 如果我们立即这样做,那么尚未收到数据:

ApiObject.getObjects(completion: { (error, objects) in }) tableView.reloadData() 

如果我们在这里重新加载数据,表视图将立即刷新(在我们实际接收数据之前)。 通过在完成块中执行它,我们说,在完成函数时运行代码,而不是在函数实际返回时:

 ApiObject.getObjects(completion: {(error, objects) in self.tableView.reloadData() }) 

这里我们在获取对象后运行它,而不是在函数本身到达结束时运行它。


编辑

也许这会让事情变得更容易; 我有以下代码:

 let comeInAnimation = POPBasicAnimation(propertyNamed: kPOPLayoutConstraintConstant)! comeInAnimation.toValue = 0 comeInAnimation.completionBlock = { (anim, success) -> Void in self.loginButton.enabled = true self.signupButton.enabled = true } signUpContainingViewLeftConstraint.pop_add(comeInAnimation, forKey: AnimationString.EnterExit.identifier) 

这是使用POP动画框架。 在这种情况下,我有一个登录和注册按钮,但我也有一个动画供他们出现。 我不希望按钮在它们出现时被点击,所以我将它们的启用设置为false。 现在您可以看到它们已设置为在completionBlock中启用。 这意味着,当动画完成时,完成块被调用,我知道现在是时候设置它们被启用了。 我这样做是这样的:

 let comeInAnimation = POPBasicAnimation(propertyNamed: kPOPLayoutConstraintConstant)! comeInAnimation.toValue = 0 signUpContainingViewLeftConstraint.pop_add(comeInAnimation, forKey: AnimationString.EnterExit.identifier) self.loginButton.enabled = true self.signupButton.enabled = true 

即使在调用动画后设置了启用的属性,实际上也会在动画完成之前设置属性。 因为程序逐行运行,所以添加动画然后立即设置属性(这太早了)。

注意:这是一个问题,因为这些函数是异步运行的。 也就是说,它允许程序在执行其操作时继续运行。 如果这行代码被阻止(在程序竞争之前停止程序),那么将代码放在一个完成块中并立即放入它将是同样的事情。 但在现实生活中,我们不想阻止,因为它给出了程序冻结的外观。