簡體   English   中英

了解swift Alamofire completionHandler

[英]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)
}

代碼正在運行,但我完全不理解。

  1. func authenticateUser有參數completionHandler :( responseObject:String?,error:NSError?) - >(),這是對completionHandler方法的引用嗎? 還是一個對象? 什么是 - >()的目的?
  2. 當我調用authenticateUser func時,我如何實際訪問響應? 在我的任何api函數中都沒有返回,funcname {(參數,參數)in ..}語法似乎很奇怪。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM