我正在阅读苹果开发者文档关于转义闭包的定义。它表示"当闭包作为参数传递给函数时,闭包被称为转义函数,但在函数返回后调用"
我不确定最后一部分是什么意思,它是什么意思"在函数返回后#34;?是否"在函数返回值"?
之后答案 0 :(得分:0)
以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
即使在调用动画后设置了启用的属性,实际上也会在动画完成之前设置属性。因为程序逐行运行,所以添加动画然后立即设置属性(这太早了)。
注意:这是一个问题,因为这些函数是异步运行的。也就是说,它允许程序在执行其操作时继续运行。如果这行代码被阻止(在程序竞争之前停止程序),那么将代码放在完成块中并立即放入它将是同样的事情。但在现实生活中,我们不想阻止,因为它给出了程序冻结的外观。