你可以异步调度非转义闭包函数吗?

时间:2017-01-19 00:23:28

标签: ios swift asynchronous swift3 closures

我简要理解转义和非转义闭包之间的区别:

  • 在函数返回后调用转义闭包。据我所知,这类似于中回调的处理方式 - 函数立即返回,它们异步执行,并且在闭包/完成时处理函数内部长时间运行的操作的结果阻止/回调被调用。
  • 非转义闭包似乎是同步执行的,在长时间运行操作完成之前,函数本身不会返回。

(我做对了吗?)

阅读更改日志以及从Swift 2的@noescape移至Swift 3 @escapingSE-0103)的理由,看来您可以异步发送非 - 关闭封闭。

这是真的吗?可能的?

  

您可以异步调度非转义闭包函数吗?如果是这样,怎么样?

奖励积分 - 我真的想了解为什么存在转义和非转义闭包:

  • 是否存在异步调度非转义闭包代替转义闭包的实际用例?
  • 在设计方案中,它表明函数式编程受益于非转义(读取:同步?)是默认值。这是真的?为什么?
  • 非转义闭包与中的承诺之间是否有任何相似之处?
  • 如果我对所有这些都不对,为什么不把它称为@async而不是@escaping

1 个答案:

答案 0 :(得分:4)

我无法想象异步调度函数如何可以非转义。提案中是否有特定声明表明?

关于您的其他问题:

  
      
  • 是否存在异步调度非转义闭包代替转义闭包的实际用例?
  •   

这不应该是可能的,所以它不会是一个用例:)

  
      
  • 在设计方案中,它表明函数式编程受益于非转义(读取:同步?)是默认值。这是真的?为什么?
  •   

该提案表示,功能编程将受益于较少的样板(即必须将所有参数标记为@noescape)。由于函数式编程通常需要许多函数 - 主要是非转义的参数,这个新的默认值允许函数式算法具有更清晰,更简洁的签名,并减少在任何地方键入@noescape样板。

  
      
  • 非转义闭包与node.js中的承诺之间是否有任何相似之处?
  •   

不,promises是异步的,可以使用转义闭包而不是非转义闭包在Swift中实现。

  
      
  • 如果我对所有这些都错了,为什么不把它叫做@async而不是@escaping?
  •   

因为它们的概念并不完全相同。转义闭包可以同步执行,但可以保存以便以后执行。 @async描述了执行的本质,但@escaping仅表示在传递的函数返回后执行闭包。当一个转义闭包执行时,它可能会同时或异步地执行此操作。