【问题标题】:What does it mean to call an escaping closure after the function returns? [duplicate]函数返回后调用转义闭包是什么意思? [复制]
【发布时间】:2023-03-22 16:33:01
【问题描述】:

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

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

【问题讨论】:

  • 我认为this answer 会解决问题的。
  • 这个问题并不是真正的重复。我已经阅读了另一个问题,但我仍然不明白..“之后”是什么意思?之后立马?十亿年后?关闭会被执行吗?如何?隐式还是显式? Apple Swift 手册中的示例将闭包放入一个数组中,然后调用它们调用数组元素。否则他们根本不会被处决,我想。那么它是如何工作的呢?

标签: ios swift escaping closures


【解决方案1】:

以调用 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。现在您可以看到它们在完成块中设置为启用。这意味着,当动画完成时,完成块被调用,我知道现在是时候将它们设置为启用了。如果我这样做了:

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

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

注意:这是一个问题,因为这些函数是异步运行的。也就是说,它允许程序在执行其操作时继续运行。如果这行代码被阻塞(停止程序直到它完成),那么将代码放在完成块中并立即将其放在后面将是同一件事。但在现实生活中,我们不想阻止,因为它给人的感觉是程序已冻结。

【讨论】:

  • “通过在完成块中执行它,我们是说,在我们完成函数时运行代码,而不是在函数实际返回时”“返回”这个词在这种情况下是什么意思?我知道函数可以返回值,但是函数返回是什么意思?
  • 在这种情况下,是在最后一行代码完成的时候。该程序逐行运行代码,因此在上面的第一个示例中,ApiObject.getObjects 是一个将包含几行代码的函数。一旦执行了最后一行代码,该函数就完成了,它将继续执行下一行。但是这个函数在完成它的操作(数据的获取)时需要做一些事情(重新加载表)。这就是完成块中将发生的事情。
猜你喜欢
  • 2016-09-03
  • 2016-07-27
  • 2023-03-27
  • 1970-01-01
  • 2011-07-08
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多