Swift中的回调
回叫是一个非常有趣的话题,我们经常在Swift /目标C中遇到。在本文中,我们不仅会从理论上了解回叫,而且还将能够理解何时以及如何在代码中使用它们。
在开始之前,让我们先了解一下每次阅读回调时经常遇到的单词。
- 处理程序/完成处理程序
- 积木
- 代表们
- 关闭
以上所有术语表示同一事物,即“回调”。 它们只是在语法上有所不同。 块/闭包或委托具有不同的语法,但工作方式相同。
注意:我们将在稍后更加详细地了解Blocks,委托和闭包。
什么是回叫?
回调是一个函数或代码块,它将在某个时间点作为参数传递到另一个函数中。
func callback(){
// 做点什么
}
func executeCallBack(回调){
//做点什么
}
现在的问题是,我们在哪里以及为什么需要回调。
假设要求我们构建一个应用程序以从服务器下载文件,并以下载百分比或下载完成后更新界面。
有了一个向服务器发出请求并下载文件的功能。 我们不能只是调用该函数并期望它在下载完成后返回,因为下载过程可能需要几分钟到几小时的时间,并且在那之前我们不能阻止UI。 在这种情况下,回调可以挽救。 我们可以使下载功能异步运行,尽管它会在下载完成之前立即运行,但是下载状态可以在实际完成后稍晚更新。因此,您要做的就是将下载功能传递给回调函数,以在下载完成后调用或更新进度百分比。
同样,让我们考虑另一种情况。 假设有一个要求,我们希望将数据从弹出窗口传递到呈现视图控制器。 请参考下图。 在这种情况下,还需要回调以将数据从弹出窗口传递到视图控制器,同时将其关闭。
简而言之,我们可以在以下情况下应用回调:
- 将数据传递到上一个视图控制器或更新UI。
- 当一个任务正在启动时,它将异步完成(即,将在调用函数返回后的一段时间内完成)。
让我们看一下带有多个回调(Swift 4.0)的以下示例:
func downloadMethod(_ params:String, successHandler :@escaping(_ arg:String)-> Void, failureHandler :@escaping(_ error:Error?)-> Void)
{
//下载文件后成功回调
successHandler (“已成功下载。”)
如果让err =错误{
//如果发生某些错误,则调用失败回调
failureHandler (错误)
}
}
downloadMethod ( “要下载的文件名”,successHandler:{
(argString)在
//打印argString
}
)
{(错误)
//打印错误
}
注意:如果闭包是方法的最后一个参数,则可以通过尾随闭包语法来表示它,即先关闭方法然后调用闭包。