获取JSON数据函数 - 地址noch可达 - NSURLErrorDomain错误-1002

时间:2014-11-11 21:35:54

标签: json xcode swift

我有一个从某个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()
    }

谢谢!

2 个答案:

答案 0 :(得分:0)

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.
}

答案 1 :(得分:-2)

创建如下方法以检查有效网址。

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)
}

然后更新您的方法。添加一行来调用验证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()
}