繁体   English   中英

如何在从Swift 3中的函数返回结果之前等待URLSession完成

[英]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 = falsereturn 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.

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