2015-09-03 3 views
6

У меня есть эти два метода в моем классе API, чтобы получить данные из API:Понимание быстры Alamofire completionHandler

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: Строка ?, об ошибке: NSError?) ->(), является ли это ссылка на метод completionHandler? или это объект? В чем цель ->()?
  2. Когда я вызываю функцию authenticateUser, как мне получить доступ к ответу? В любой из моих функций api нет возврата, синтаксис funcname {(parameter, parameter) in ..} кажется действительно странным.
+0

Ваша правка делает вопрос совершенно непонятно. –

ответ

9

completionHandler является параметром закрытия. Как Свифт документация говорит:

Closures are self-contained blocks of functionality that can be passed around and used in your code. Closures in Swift are similar to blocks in C and Objective-C and to lambdas in other programming languages.

Итак, что замыкание используется для, чтобы добавить некоторые функции самостоятельно, что вы хотите добавить к выполнению вашей функции.

В вашем случае вы вызываете 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

+0

Отличный ответ, спасибо большое! –

Смежные вопросы