了解swift Alamofire completionHandler

我的API类中有这两种方法可以从API获取数据:

func authenticateUser(completionHandler: (responseObject: String?, error: NSError?) -> ()) { makeAuthenticateUserCall(completionHandler) } func makeAuthenticateUserCall(completionHandler: (responseObject: String?, error: NSError?) -> ()) { Alamofire.request(.GET, loginUrlString) .authenticate(user: "a", password: "b") .responseString { request, response, responseString, responseError in completionHandler(responseObject: responseString as String!, error: responseError) } } 

然后在另一个类中,我使用以下代码来访问数据:

 API().authenticateUser{ (responseObject, error) in println(responseObject) } 

代码正在运行但我完全不理解。

  1. func authenticateUser有参数completionHandler 🙁 responseObject:String?,error:NSError?) – >(),这是对completionHandler方法的引用吗? 还是一个对象? 什么是 – >()的目的?
  2. 当我调用authenticateUser func时,我如何实际访问响应? 在我的任何api函数中都没有返回,funcname {(参数,参数)in ..}语法似乎很奇怪。

completionHandler是一个闭包参数。 正如Swift文档所说:

闭包是自包含的function块,可以在代码中传递和使用。 Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambdas。

因此,闭包用于添加您想要添加到函数执行中的某些function。

在您的情况下,您调用authenticateUser并传递一个接收(responseObject, error)并执行println(responseObject)的闭包。 authenticateUser()completionHandler参数下接收你的闭包,然后调用makeAuthenticateUserCall()completionHandler闭包传递给它。

然后再看一下定义你可以看到func makeAuthenticateUserCall(completionHandler: (responseObject: String?, error: NSError?) -> ())这意味着像authenticateUser() makeAuthenticateUserCall()是一个接收闭包的函数参数,名称为completionHandlermakeAuthenticateUserCall()使用AlamoFire发出网络请求,并在再次作为responseString()方法的参数传递的闭包下捕获响应。 所以你有了:

 //here you call authenticateUser with a closure that prints responseObject API().authenticateUser{ (responseObject, error) in println(responseObject) } 

然后:

 //authenticateUser receives your closure as a parameter func authenticateUser(completionHandler: (responseObject: String?, error: NSError?) -> ()) { //it passes your closure to makeAuthenticateUserCall makeAuthenticateUserCall(completionHandler) } //makeAuthenticateUserCall receives your closure func makeAuthenticateUserCall(completionHandler: (responseObject: String?, error: NSError?) -> ()) { Alamofire.request(.GET, loginUrlString) .authenticate(user: "a", password: "b") //here you pass a new closure to the responseString method .responseString { request, response, responseString, responseError in //in this closure body you call your completionHandler closure with the //parameters passed by responseString and your code gets executed //(that in your case just prints the responseObject) completionHandler(responseObject: responseString as String!, error: responseError) } } 

有关更多信息,请阅读文档: Swift Closures