【问题标题】:Understanding swift Alamofire completionHandler了解 swift Alamofire completionHandler
【发布时间】:2015-11-29 01:29:07
【问题描述】:

我的 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 函数时,我如何实际访问响应?我的任何 api func 都没有返回,.. } 语法中的 funcname{(parameter, parameter) 看起来很奇怪。

【问题讨论】:

  • 您的编辑使问题完全无法理解。

标签: ios swift alamofire


【解决方案1】:

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

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

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

在您的情况下,您调用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多