You need to set a callback function that will be called whenever you want in your loginPassword() function.
This may be a way to achieve it:
func loginPassword(callback: ((isOk: Bool)->Void)?) -> String{ var loginJSON = ["auth": ["passwordCredentials": ["username": _username, "password": _password]]]; var returnJSON: String request(.POST, baseUrl, parameters: loginJSON, encoding: .JSON) .responseJSON { (request, response, data, error) in if let anError = error{ // got an error in getting the data, need to handle it println("error calling POST on /posts") println(error) callback?(isOk: false) } else if let data: AnyObject = data{ // handle the results as JSON, without a bunch of nested if loops let post = JSON(data) // to make sure it posted, print the results println("JSON Returned") callback?(isOk: true) } } }
and then...
override func viewDidLoad() { super.viewDidLoad() var identity = Identity(username: "John Apleseed", apiKey: "213123123") identity.loginPassword { (isOK) -> Void in if (isOK) { //do good stuff here }else{ // do error handling here } } }
UPDATE
Additionally, your calling function might look like this:
override func viewDidLoad() { super.viewDidLoad() var identity = Identity(username: "John Apleseed", apiKey: "213123123") identity.loginPassword(handlePasswordRequest) }
and you can add as many callback handlers as you might need without interfering with a bunch of nested closures ...
private func handlePasswordRequest(isOK: Bool){ if (isOK) { //do good stuff here }else{ // do error handling here } }
UPDATE 2
If you need to call a callback deep into the call hierarchy, you need to pass a callback as a parameter to all previous closures.
UPDATE 3
I would try RxAlamofire and all about RxSwift
source share