簡體   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