嗨,我有一个初学者的问题,在Swift 3中我找不到一个好的解决方案。我希望有人能够偷偷摸摸。
我有以下代码,如果用户凭据有效或无效,它将检查rest api。我希望它等待请求完成,然后返回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
}
}
关于ios - 如何在Swift 3中从函数返回结果之前等待URLSession完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42804320/