Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 理解swift Alamofire completionHandler_Ios_Swift_Alamofire - Fatal编程技术网

Ios 理解swift Alamofire completionHandler

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

我的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)
}
代码正在运行,但我不完全理解它

  • func authenticateUser具有参数completionHandler:(responseObject:String?,error:NSError?->(),这是对completionHandler方法的引用吗?还是一个物体?->()的目的是什么
  • 当我调用authenticateUser func时,我实际上如何访问响应?在我的任何api函数中都没有返回,funcname{(parameter,parameter)in..}语法看起来非常奇怪

  • completionHandler
    是一个闭包参数。正如Swift文件所述:

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

    因此,闭包的作用是添加一些您自己想要添加到函数执行中的功能

    在本例中,您调用
    authenticateUser
    并传递一个闭包,该闭包接收
    (responseObject,error)
    ,并执行
    println(responseObject)
    authenticateUser()
    completionHandler
    参数下接收您的闭包,然后调用
    makeAuthenticateUserCall()
    将您的
    completionHandler
    闭包传递给它

    然后再次查看定义,您可以看到
    func makeauthenticatesercall(completionHandler:(responseObject:String?,error:NSError?)->()
    ,这意味着like
    authenticateUser()
    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)
        }
    }