Swift等待回调在方法返回之前完成

时间:2017-03-31 08:52:08

标签: ios swift asynchronous

我正在使用Siesta REST API客户端进行swift。我正在登录外部API(成功)并从午休请求对象中获取结果。该请求有两个回调 - onSuccess和onFailure。

如果登录成功,我在钥匙串中设置一个令牌,然后将结果返回给视图控制器 - 如果成功则将其转换为新的视图控制器。

但是,正如我假设回调是异步使用的,我的函数没有返回正确的结果。

 @IBAction func normalLoginButton(_ sender: UIButton) {

    //do normal login
    let standardLogin = StandardLogin()
    let credentials = ["email" : "john@example.com", "password": "password" ]
    let loginResult = standardLogin.login(params: credentials)
    print(loginResult)
    if loginResult {
        performSegue(withIdentifier: "showSuccessfulLoginView", sender: self)
    }

 }

 func login(params : Dictionary<String,String>) -> Bool{
    var loginSuccess = false
    let loginRequest = wrApi.makePostRequest(route: "login", params:params)

    loginRequest
        .onSuccess { data in
            print("succes")
            self.setJwtToken(jsonData: data.content)
            loginSuccess = true
        }
        .onFailure { error in print("an error occured")
    }


    return loginSuccess

}

我的问题基本上是如何在返回loginSuccess布尔值之前等待回调完成?

我很快乐,所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:3)

登录是acsync功能,因此您无法使用return 尝试关闭:

   func login(params : Dictionary<String,String>, handleFinish:((isOK:Bool,param: Type?)->())){
       var loginSuccess = false
    let loginRequest = wrApi.makePostRequest(route: "login", params:params)

    loginRequest
        .onSuccess { data in
            print("succes")
            self.setJwtToken(jsonData: data.content)
            loginSuccess = true
            handleFinish(isOK: true, param :data.content )
        }
        .onFailure { error in 
                       print("an error occured")
                        handleFinish(isOK: false, param :nil )
    }

   }

并称之为:

login(param) { (isOK, param) in
  if isOK{
   print("login success: \(param)")
 }

}

答案 1 :(得分:1)

正如@Nguyen指出的那样,你无法从异步函数返回一个立即值。鉴于您使用返回值所做的一切都是执行您的segue - 只需将该调用移动到完成处理程序

@IBAction func normalLoginButton(_ sender: UIButton) {
    //do normal login
    let standardLogin = StandardLogin()
    let credentials = ["email" : "john@example.com", "password": "password" ]
    standardLogin.login(params: credentials)
}


func login(params : Dictionary<String,String>){
    let loginRequest = wrApi.makePostRequest(route: "login", params:params)

    loginRequest
        .onSuccess { data in
            print("success")
            self.setJwtToken(jsonData: data.content)
            performSegue(withIdentifier: "showSuccessfulLoginView", sender: self)
    }
        .onFailure { error in print("an error occured")
    }
}