<分区>
我正在阅读苹果开发者文档中关于转义闭包的定义。它说“当闭包作为参数传递给函数时,据说闭包会转义函数,但在函数返回后被调用”
我不确定最后一部分应该是什么意思,“函数返回后”是什么意思?是不是表示“函数返回值之后”?
<分区>
我正在阅读苹果开发者文档中关于转义闭包的定义。它说“当闭包作为参数传递给函数时,据说闭包会转义函数,但在函数返回后被调用”
我不确定最后一部分应该是什么意思,“函数返回后”是什么意思?是不是表示“函数返回值之后”?
最佳答案
以调用 API 为例。这个电话需要时间,但我们想在电话结束后做一些事情。例如,假设我们想用我们拉取的新数据刷新 UITableView。如果我们立即执行此操作,则还不会收到数据:
ApiObject.getObjects(completion: { (error, objects) in })
tableView.reloadData()
如果我们在这里重新加载数据, TableView 将立即刷新(在我们实际收到数据之前)。通过在完成 block 中执行此操作,我们是说,在我们完成函数时运行代码,而不是在函数实际返回时运行代码:
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 中被设置为启用。这意味着,当动画完成时,完成 block 被调用,我知道现在是时候将它们设置为启用了。如果我这样做的话:
let comeInAnimation = POPBasicAnimation(propertyNamed: kPOPLayoutConstraintConstant)!
comeInAnimation.toValue = 0
signUpContainingViewLeftConstraint.pop_add(comeInAnimation, forKey: AnimationString.EnterExit.identifier)
self.loginButton.enabled = true
self.signupButton.enabled = true
即使启用的属性是在调用动画之后设置的,但这些属性实际上是在动画完成之前设置的。因为程序是逐行运行的,所以添加了动画,然后立即设置了属性(这还为时过早)。
注意:这是一个问题,因为这些函数异步运行。也就是说,它允许程序在执行任务时继续运行。如果这行代码被阻塞(停止程序直到它被竞争)然后将代码放在一个完成 block 中并立即将它放在后面是一回事。但在现实生活中,我们不想阻塞,因为它给人一种程序已卡住的感觉。
关于ios - 函数返回后调用转义闭包是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47305366/