[英]How to wait for a delegate function to finish before returning value from main function
[英]how to wait for the URLSession to finish before returning the result from a function in Swift 3
嗨,我有一個初學者的問題,我無法在Swift 3中找到一個好的解決方案。我希望有人能夠發牢騷。
我有以下代碼,如果用戶憑據有效,將檢查休息api。 我希望它等待resquest完成然后返回true或false。 現在正在發送異步。
我檢查JSON值的方式也會受到歡迎。
func CheckUsernamePassword(username :String ,code:String )-> bool {
var validCredentials = false
let urlString = "\(self.baseurl)/accounts/validateusernamepassword.json?username=\(username)&password=\(code)&api_key=\(self.api_key)"
let url = URL(string: urlString)
URLSession.shared.dataTask(with:url!) { (data, response, error) in
if error != nil {
print("Error URLSession : \(error!)")
validCredentials = false
} else {
do {
let parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any]
if parsedData["validated"] != nil {
if "\(parsedData["validated"]!)" == "1" {
print("Login credentials are correct")
validCredentials = true
}else {
print("Login credentials are not correct")
print("\(parsedData["validated"]!)")
print("\(parsedData["message"]!)")
validCredentials = false
}
}else{
print("Json Parse error: \(parsedData)")
validCredentials = false
}
} catch let error as NSError {
print("Error Parsing Json \(error)" )
validCredentials = false
}
}
}.resume()
return validCredentials
}
您不能將異步任務中的某些內容作為返回值返回。
不要等 ,使用完成處理程序:
替換方法的簽名(名稱應以小寫字母開頭)
func checkUsernamePassword(username: String, code: String, completion: @escaping (Bool)->() ) {
刪除行var validCredentials = false
並return validCredentials
將所有出現的validCredentials = false
替換為completion(false)
,將validCredentials = true
替換為completion(true)
。
調用方法
checkUsernamePassword(username: "Foo", code: "Baz") { isValid in print(isValid) // do something with the returned Bool DispatchQueue.main.async { // update UI } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.