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

标签 ios json xcode swift3 urlsession

嗨,我有一个初学者的问题,在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 = falsereturn validCredentials
  • validCredentials = false替换所有出现的completion(false)
    validCredentials = truecompletion(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/

    相关文章:

    ios - 放大 UIScrollView 时未调用 scrollViewDidEndZooming

    ios - 使 Controller 随着 iOS 中 UILabel 中文本的数量而扩展

    objective-c - objective-c 在while循环中处理其他事件

    javascript - For循环: TypeError: Cannot read property '0' of undefined

    java - 使用Spring在Rest API中返回实体

    ios - 向 SKScene 添加点(如 UIPageViewController 中的点)

    iphone - 如何测试 iOS 推送通知?

    ios - 为什么这个应用程序从 Testflight 运行时会崩溃 100%,而从 Xcode 运行时可能会崩溃 10%

    ios - 无法在 bundle 中找到名为 'Main' 的 Storyboard,Xcode 7

    ios - 使用 Objective-C 计算年龄