swift2.0, devolución de información de llamadas REST (Alamofire)

Gente, intentando comprender el enfoque programático correcto para devolver datos de hacer llamadas API externas.

Antes de seguir adelante y crear mi propio marco rápido para la reutilización de código (que gestiona todas las llamadas de rest de API para mi aplicación), me gustaría preguntar a la comunidad acerca de cómo lidiar con la siguiente situación:

Aquí tenemos un button que se toca en la vista de inicio de session, necesitamos hacer una llamada a nuestro service de authentication y reactjsr sobre las cosas que recibimos.

viewController:

import myLib @IBAction func loginButtonTapped(sender: AnyObject) { let email = emailField.text! let password = pwField.text! let loginResult = myLib.login(email,password) if (loginResult.success) { NSUserDefaults.standardUserDefaults().setBool(true, forKey: "isUserLoggedIn") NSUserDefaults.standardUserDefaults().synchronize() self.dismissViewControllerAnimated(true, completion: nil) } else { displayAlertMessage(loginResult.message) } } 

myLib.login:

 import Foundation import Alamofire import SwiftyJSON public func Login(email: String, password: String, completion: ((success: Bool, message: String?, token: String?) -> Void)) { let parameters: [String: String] = [ "username" : email, "password" : password ] let endpoint = "https://api.foo.bar/login" Alamofire.request(.POST, endpoint, parameters: parameters, encoding: .JSON) .responseJSON { response in guard response.result.error == nil else { print(response.result.error!) completion(success: false, message: "error calling POST on /account/login", token: nil) return } if let value = response.result.value { let apiResponseJSONBody = JSON(value) completion(success: true, message: nil, token: apiResponseJSONBody["token"].string) } } } 
  • ¿Es correcto devolver los resultados como estructuras? Me di count de que tenemos que hacer pública la estructura para poder devolverla.

¡Gracias! Aprecio enormemente todos los comentarios.

actualización : pregunta relevante publicada: Swift Alamofire + Protable de captura

No puede usar el valor de retorno de su método de Login de Login ya que la request es asíncrona.

Básicamente, su método de Login siempre regresará inmediatamente con success = false .

Para retornar asincrónicamente, debe agregar un bloque de finalización a Login de Login :

 public func Login(email: String, password: String, completion: (success: Bool, message: String?, token: String?) -> Void) { ... } 

Luego, cuando reciba la respuesta de Alamofire, llame a su bloque de finalización de la siguiente manera:

 completion(success: false, message: nil, token: nil) 

Desde su controller de vista, puede usar Login esta manera:

 myLib.Login(email, password) { success, message, token in if success { ... } }