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

标签 ios swift escaping closures

<分区>

我正在阅读苹果开发者文档中关于转义闭包的定义。它说“当闭包作为参数传递给函数时,据说闭包会转义函数,但在函数返回后被调用”

我不确定最后一部分应该是什么意思,“函数返回后”是什么意思?是不是表示“函数返回值之后”?

最佳答案

以调用 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/

相关文章:

ios - 如何在 iPhone 上以编程方式发送短信?

ios - Collection View 单元格未正确加载图像

ios - Flexbox 和 safari

swift - 尝试使用 Xcode 10.1 或应用程序加载器上传 IPA 时出现错误

python - 如何自动转义 Python 字符串中的控制字符

python - 仅一次转义 python 中的字符(单反冲)

iOS 根据浮点值排序数组

swift - 删除的 Sprite 仍然可点击

iOS - 如何在从远程服务流式传输时在 UITextView 中开始新行

c# - 如何使用 HttpWebRequest 转义 POST 中的 URL 编码数据