[英]Understanding 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)
}
代碼正在運行,但我完全不理解。
completionHandler
是一個閉包參數。 正如Swift文檔所說:
閉包是自包含的功能塊,可以在代碼中傳遞和使用。 Swift中的閉包類似於C和Objective-C中的塊以及其他編程語言中的lambdas。
因此,閉包用於添加您想要添加到函數執行中的某些功能。
在您的情況下,您調用authenticateUser
並傳遞一個接收(responseObject, error)
並執行println(responseObject)
的閉包。 authenticateUser()
在completionHandler
參數下接收你的閉包,然后調用makeAuthenticateUserCall()
將completionHandler
閉包傳遞給它。
然后再看一下定義你可以看到func makeAuthenticateUserCall(completionHandler: (responseObject: String?, error: NSError?) -> ())
這意味着像authenticateUser()
makeAuthenticateUserCall()
是一個接收閉包的函數參數,名稱為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)
}
}
有關更多信息,請閱讀文檔: Swift Closures
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.