首页 文章

了解swift Alamofire completionHandler

提问于
浏览
6

我的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 {(参数,参数)in ..}语法似乎很奇怪 .

1 回答

  • 9

    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

相关问题