我是新手,当我看到苹果文档中有一个关于逃避封闭的定义时,我很快就会学习:
当闭包作为参数传递给函数时,闭包被称为转义函数,但在函数返回后调用。当声明一个以闭包作为其参数之一的函数时,可以在参数的类型之前编写@escaping,以指示允许闭包转义。
@另一方面,我看到一个博客,其中博客解释了完成处理程序,如:
有时你会将一个闭包作为参数之一,但你只想在函数返回后执行闭包。例如,如果您想在完全切换到下一个ViewController后打印“Hello,world”,该怎么办?
所以我想知道完成处理程序和转义闭包是否相同或什么?
答案 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中安排新的下载任务。下载可能需要一段时间,具体取决于您的连接状态和其他因素,并且只有在下载完成后才会调用完成处理程序。
这种操作的实现方式通常是,它们将完成处理程序存储在某处,执行操作,然后调用完成处理程序。因此,完成处理程序通常是转义闭包。