逃避关闭我有点困惑

时间:2017-07-05 08:55:53

标签: ios iphone swift closures

我是新手,当我看到苹果文档中有一个关于逃避封闭的定义时,我很快就会学习:

  

当闭包作为参数传递给函数时,闭包被称为转义函数,但在函数返回后调用。当声明一个以闭包作为其参数之一的函数时,可以在参数的类型之前编写@escaping,以指示允许闭包转义。

@另一方面,我看到一个博客,其中博客解释了完成处理程序,如:

  

有时你会将一个闭包作为参数之一,但你只想在函数返回后执行闭包。例如,如果您想在完全切换到下一个ViewController后打印“Hello,world”,该怎么办?

所以我想知道完成处理程序和转义闭包是否相同或什么?

2 个答案:

答案 0 :(得分:0)

  

我想知道完成处理程序和转义闭包是一样的   或者什么?

完成和错误处理程序与执行 - 并返回 - 一大块代码(函数)后应该完成的进程相关:

  

完成处理程序是允许客户端执行某些操作的回调   框架方法或函数完成其任务时的操作。   <子> https://developer.apple.com/library/content/featuredarticles/Short_Practical_Guide_Blocks/

是逃避闭包的逻辑表示。

因此,参考转义闭包定义,默认情况下,完成处理程序是一个转义闭包。

要查看示例,您可能需要检查this answer。另外,如果您认为需要更多关于逃逸闭包的描述,您可能需要查看Q&A

答案 1 :(得分:0)

完成处理程序是传递转义闭包的一个示例,但它们不是唯一的。

事实上,完成处理程序的概念在不同级别上工作,而不是转义闭包的概念。

逃离关闭

关闭存储,可能会在将来的某个时间调用。

这与非转义闭包相反,后者立即调用闭包或根本不调用。

The difference between escaping and non-escaping closure is important for memory management。对于非转义闭包,编译器知道闭包使用的任何资源在调用后都不再使用。

完成处理程序

完成处理程序是一个操作完成后调用的闭包。

使用完成处理程序的操作通常是长时间运行的,并且可以在不同的线程上运行。当这样的操作正在运行时,您的程序可以继续其控制流程,从而使程序更具响应性。例如,如果您调用URLSession.downloadTask(withResumeData:completionHandler:),则会在URLSession中安排新的下载任务。下载可能需要一段时间,具体取决于您的连接状态和其他因素,并且只有在下载完成后才会调用完成处理程序。

这种操作的实现方式通常是,它们将完成处理程序存储在某处,执行操作,然后调用完成处理程序。因此,完成处理程序通常是转义闭包