Swift中的回调

回叫是一个非常有趣的话题,我们经常在Swift /目标C中遇到。在本文中,我们不仅会从理论上了解回叫,而且还将能够理解何时以及如何在代码中使用它们。

在开始之前,让我们先了解一下每次阅读回调时经常遇到的单词。

  1. 处理程序/完成处理程序
  2. 积木
  3. 代表们
  4. 关闭

以上所有术语表示同一事物,即“回调”。 它们只是在语法上有所不同。 块/闭包或委托具有不同的语法,但工作方式相同。

注意:我们将在稍后更加详细地了解Blocks,委托和闭包。

什么是回叫?

回调是一个函数或代码块,它将在某个时间点作为参数传递到另一个函数中。

func callback(){

// 做点什么

}

func executeCallBack(回调){

//做点什么

}

现在的问题是,我们在哪里以及为什么需要回调。

假设要求我们构建一个应用程序以从服务器下载文件,并以下载百分比或下载完成后更新界面。

有了一个向服务器发出请求并下载文件的功能。 我们不能只是调用该函数并期望它在下载完成后返回,因为下载过程可能需要几分钟到几小时的时间,并且在那之前我们不能阻止UI。 在这种情况下,回调可以挽救。 我们可以使下载功能异步运行,尽管它会在下载完成之前立即运行,但是下载状态可以在实际完成后稍晚更新。因此,您要做的就是将下载功能传递给回调函数,以在下载完成后调用或更新进度百分比。

同样,让我们​​考虑另一种情况。 假设有一个要求,我们希望将数据从弹出窗口传递到呈现视图控制器。 请参考下图。 在这种情况下,还需要回调以将数据从弹出窗口传递到视图控制器,同时将其关闭。

简而言之,我们可以在以下情况下应用回调:

  1. 将数据传递到上一个视图控制器或更新UI。
  2. 当一个任务正在启动时,它将异步完成(即,将在调用函数返回后的一段时间内完成)。

让我们看一下带有多个回调(Swift 4.0)的以下示例:

  func downloadMethod(_ params:String, successHandler :@escaping(_ arg:String)-> Void, failureHandler :@escaping(_ error:Error?)-> Void) 
{
//下载文件后成功回调
successHandler (“已成功下载。”)

如果让err =错误{
//如果发生某些错误,则调用失败回调
failureHandler (错误)
}
}
  downloadMethod  “要下载的文件名”,successHandler:{ 
(argString)在
//打印argString
}

{(错误)
//打印错误
}

注意:如果闭包是方法的最后一个参数,则可以通过尾随闭包语法来表示它,即先关闭方法然后调用闭包。