ios - 我的函数返回 String 但我无法解析它?知道为什么吗?

标签 ios json swift function class

我创建了一个名为 db_conn 的类,在这个类中我有以下函数:

public func login (email : String , password : String ) -> String  {
    var result = ""
    let url = URL(string: API.url_login.rawValue)!
    var request = URLRequest(url: url)
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "POST"
    let postString = "email=\(email)&password=\(password)"
    request.httpBody = postString.data(using: .utf8)
    let task = URLSession.shared.dataTask(with: request) { data, response, error in


        guard let data = data, error == nil else {
            print("error=\(String(describing: error))")
            return
        }

        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("\(String(describing: response))")
        }

        let responseString = String(data: data, encoding: .utf8)
        result = String(responseString!)
        //print("responseString = \(responseString!)")
    }
    task.resume()


    return result
}

然后在我的登录 viewController 类中,我尝试像 ==> 一样使用它

 @IBAction func login_button_action(_ sender: UIButton) {

       let email = email_text.text
       let passw0rd = password_text.text


        if (email != "" && passw0rd != ""){
            let db_connect = db_conn()
            if  (db_connect.login(email: email!, password: passw0rd!) == nil ){

                print("it's empty ")

            }else {

                print("not empty \(db_connect.login(email: email!, password: passw0rd!))")

            }


        }else {

            let alert = UIAlertController(title: "Error", message: "Dont leave any of the spaces blank , they all must be filled up , try again ! ", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }

当我运行该项目时,它说 db_connect.login(email: email!, password: passw0rd!) 的值不为空,但不会打印出来。 (但是在我的 db_conn calss 中,我可以轻松地打印 responseString 并且我得到返回的 JSON 格式的字符串。 知道我在哪里犯错了吗?我怎么可能修复它?

最佳答案

使用 URLSession 发出网络请求是异步运行的,这意味着 iOS 将其置于后台线程并在下载完成之前立即继续当前线程。因此,当您返回结果时,它仍然是一个空字符串。您可能想要做的是将完成闭包传递给您的 login 方法,并在完成下载时使用相关数据调用它

关于ios - 我的函数返回 String 但我无法解析它?知道为什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47636996/

相关文章:

ios - iOS 设备的文档目录路径是否恒定?

ios - 共享到应用程序的共享扩展时未调用 UIDocumentInteractionControllerDelegate 方法

iphone - ios检测线角度或度数

ios - 没有 segue 的两个 ViewController 之间的委托(delegate)

ios - 用 Metal 渲染四边形性能

iOS - 超时失败的同步请求

ios - 使用 Cocos3D 将带有纹理的 blender 3D 模型导出到 iPhone - 纹理不显示

php - Google Places Web Service API 在不同的服务器上返回不同的结果?

json - VBA Json转换器不能转换超过15位数字

java - 从 spring mvc Controller 返回一个简单的映射结构到 ajax