如何避免在 Swift 中出现"Error Domain=NSCocoaErrorDomain Code=3840"?



尝试在 Swift 中解析 JSON 响应时,我不断收到此特定错误:

错误域=

NSCocoa错误域代码=3840"无值"。UserInfo={NSDebugDescription=No value.}

法典:

    let dict = [
        "phone": phone,
        "firstname": "(String(describing: firstName))",
        "lastname": "(String(describing: lastName))"
        ]
        as [String: Any]
    if let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: []) {
        var request = URLRequest(url: URL(string: "(config.baseURL)employee")!)
        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpBody = jsonData
        request.timeoutInterval = 30.0
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            if error != nil {
                DispatchQueue.main.async {
                    self.alertController.singleButtonAlertController("Error", (error?.localizedDescription)!, self, self.defaultAction)
                    return
                }
            }
            guard let data_ = data else {
                return
            }
            do {
                let jsonObj = try JSONSerialization.jsonObject(with: data_, options: .mutableContainers) as? NSDictionary
                guard let parseJSON = jsonObj else {
                    return
                }
                self.navigationItem.rightBarButtonItem = self.rightBarButton

                let meta = parseJSON["meta"] as? [String:Any]
                let status = meta!["status"] as? String

                if status == "200" {
                    isEmployeeModified = true
                    self.dismiss(animated: true, completion: nil)
                } else {
                    let info = meta!["info"] as? String
                    let message = meta!["message"] as? String
                    DispatchQueue.main.async {
                        self.alertController.singleButtonAlertController(info!, message!, self, self.defaultAction)
                    }
                }
            } catch let error as NSError {
                print(error)
            }
        }
        task.resume()

我在项目的其他部分使用了类似的代码,并且所有内容都检查出来。

根据此错误,来自服务器的响应不是有效的JSON您可以使用responseString而不是如下所示的responseJSON

 Alamofire.request(URL, method: requestMethod, parameters: params).responseString{ response in
    print(response)
}

我能够找出问题所在,我将在这里为未来的读者解释这一点。显然,我以错误的方式执行GET请求,因此当我打算执行POST请求时,出于某种原因,它仍然将其视为GET请求,这就是为什么我一直得到响应:错误域=NSCocoaError域代码=3840"无值"。UserInfo={NSDebugDescription=No value.}

下面是我重构的代码,它可以轻松工作:

    let dict = [
        "phone": phone,
        "firstname": firstName,
        "lastname": lastName
        ] as [String : Any]
    guard let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: []) else {
        return
    }
    guard let url = URL(string: "(config.baseURL)employee") else {
        return
    }
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = jsonData as Data
    request.timeoutInterval = 10
    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in
        if let response = response {
            print("JSON Response: (response)")
        }
        if error != nil {
            DispatchQueue.main.async {
                self.navigationItem.rightBarButtonItem = self.rightBarButton
                self.alertController.singleButtonAlertController("Error", (error?.localizedDescription)!, self, self.defaultAction)
                return
            }
        }
        if let data = data {
            do {
                let parseJSON = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary
                let meta = parseJSON!["meta"] as? [String:Any]
                let status = meta!["status"] as? String

                if status == "200" {
                    isEmployeeModified = true
                    self.dismiss(animated: true, completion: nil)
                } else {
                    let info = meta!["info"] as? String
                    let message = meta!["message"] as? String
                    DispatchQueue.main.async {
                        self.alertController.singleButtonAlertController(info!, message!, self, self.defaultAction)
                    }
                }
            } catch {
                print(error)
            }
        }
    }.resume()

相关内容

  • 没有找到相关文章

最新更新