繁体   English   中英

快速等待回调完成,然后返回方法

[英]Swift Wait for Callback to finish before method return

我正在使用Siesta REST API客户端进行快速处理。 我正在成功登录到外部API,并从siesta请求对象获取结果。 该请求具有两个回调-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布尔值之前如何等待回调完成?

我很快就很新,因此任何帮助将不胜感激。

login是acsync函数,因此您不能使用return try闭包:

   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)")
 }

}

正如@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")
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM