【问题标题】:Get JSON data function - Address noch reachable - NSURLErrorDomain error -1002获取 JSON 数据函数 - 地址不可达 - NSURLErrorDomain 错误 -1002
【发布时间】:2014-11-11 21:35:54
【问题描述】:

我有一个函数可以从某个 IP 地址检索 JSON 数据。 如果无法访问 ip,xcode 会在

处给我以下错误
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary

操作无法完成。 (NSURLErrorDomain 错误 -1002。)致命错误:在展开可选值时意外发现 nil

如何检查 jsonResult 是否有效或 ip-address 是否有效?

func getJsonData() {

        let urlAsString = NSUserDefaults.standardUserDefaults().objectForKey("ipAddress") as String
        let url: NSURL  = NSURL(string: urlAsString)!
        let urlSession = NSURLSession.sharedSession()

        let jsonQuery = urlSession.dataTaskWithURL(url, completionHandler: { data, response, error -> Void in
            if (error != nil) {
                println(error.localizedDescription)
            }
            var err: NSError?

            var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary


            if (err != nil) {
                println("JSON Error \(err!.localizedDescription)")
            }

            //Display Data
            dispatch_async(dispatch_get_main_queue(), {
                self.label.text = String(format: "%.3f", (jsonResult["pwr"] as Float!)/1000)
            })
        })
        jsonQuery.resume()
    }

谢谢!

【问题讨论】:

    标签: json xcode swift


    【解决方案1】:
    if (error != nil) {
        println(error.localizedDescription)
    }
    

    向调试器控制台打印错误是不够的。必须处理错误。问问自己——如果没有互联网连接,你想做什么?您想向用户显示错误吗?尝试再次发送请求?

    基本事实是,如果出现错误,您将无法继续解析数据。数据不存在,没有加载。如果您尝试解析数据(即nil),您的应用将崩溃。

    if (error != nil) {
        //XXX: display error to the user, e.g. using an alert
        return; //return immediately, don't proceed to parsing.
    }
    

    【讨论】:

      【解决方案2】:

      创建一个类似下面的方法来检查有效的 url。

      func validateUrl (stringURL : NSString) -> Bool {
      
          var urlRegEx = "((https|http)://)((\\w|-)+)(([.]|[/])((\\w|-)+))+"
          let predicate = NSPredicate(format:"SELF MATCHES %@", argumentArray:[urlRegEx])
          var urlTest = NSPredicate.predicateWithSubstitutionVariables(predicate)
      
          return predicate.evaluateWithObject(stringURL)
      }
      

      然后更新你的方法。添加一行调用 validate url 方法。

      func getJsonData() {
      
          let urlAsString = NSUserDefaults.standardUserDefaults().objectForKey("ipAddress") as String
      
          var isValidURL = validateUrl(urlAsString)
          if (!isValidURL) {
              // Return from here. URL is invalid
              return
          }
      
          let url: NSURL  = NSURL(string: urlAsString)!
          let urlSession = NSURLSession.sharedSession()
      
          let jsonQuery = urlSession.dataTaskWithURL(url, completionHandler: { data, response, error -> Void in
              if (error != nil) {
                  println(error.localizedDescription)
              }
              var err: NSError?
      
              var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
      
      
              if (err != nil) {
                  println("JSON Error \(err!.localizedDescription)")
              }
      
              //Display Data
              dispatch_async(dispatch_get_main_queue(), {
                  self.label.text = String(format: "%.3f", (jsonResult["pwr"] as Float!)/1000)
              })
          })
          jsonQuery.resume()
      }
      

      【讨论】:

      • 我不认为 URL 有效性是这里的问题。这是关于失去互联网连接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      相关资源
      最近更新 更多