Ios 理解swift Alamofire completionHandler
我的API类中有两种方法可以从API获取数据:Ios 理解swift Alamofire completionHandler,ios,swift,alamofire,Ios,Swift,Alamofire,我的API类中有两种方法可以从API获取数据: func authenticateUser(completionHandler: (responseObject: String?, error: NSError?) -> ()) { makeAuthenticateUserCall(completionHandler) } func makeAuthenticateUserCall(completionHandler: (responseObject: S
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)
}
代码正在运行,但我不完全理解它
completionHandler
是一个闭包参数。正如Swift文件所述:
闭包是自包含的功能块,可以在代码中传递和使用。Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambdas
因此,闭包的作用是添加一些您自己想要添加到函数执行中的功能
在本例中,您调用authenticateUser
并传递一个闭包,该闭包接收(responseObject,error)
,并执行println(responseObject)
authenticateUser()
在completionHandler
参数下接收您的闭包,然后调用makeAuthenticateUserCall()
将您的completionHandler
闭包传递给它
然后再次查看定义,您可以看到func makeauthenticatesercall(completionHandler:(responseObject:String?,error:NSError?)->()
,这意味着likeauthenticateUser()
makeauthenticatesercall()是一个接收闭包作为参数的函数,以completionHandler
的名义makeAuthenticateUserCall()
使用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)
}
}