如果数据无法访问,iOS应用程序将崩溃

时间:2013-06-12 09:39:53

标签: iphone ios objective-c nsjsonserialization

我正在使用以下内容使用NSJSONSerialization请求数据。我遇到的问题是,如果数据无法访问(例如没有网络连接),应用程序崩溃。如果网络或服务器出现故障,我怎么能停止应用程序崩溃?

我在[self requestData];方法

中呼叫viewDidLoad:
-(void)requestData {

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
                                                          URLWithString:@"http://example.com/api/nodes"]];

    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

    NSError *jsonParsingError = nil;

    NSDictionary *publicData =  [NSJSONSerialization JSONObjectWithData:response
                                                                options:0
                                                                  error:&jsonParsingError];
    publicDataArray = [publicData objectForKey:@"data"];
    for(publicDataDict in publicDataArray) {
        NSLog(@"data output is %@",[publicDataDict objectForKey:@"title"]);

    }
}

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

一些想法:

  1. 使用Reachability检查网络连接
  2. 始终使用异步请求,否则它会阻止您的UI,直到应用从服务器获得响应。
  3. 始终使用异常处理
  4. 问题在于:

    您正使用synchronousviewDidLoad中呼叫sendSynchronousRequest个请求。但服务器已关闭,因此您无法获得结果,并且仍然期望任何数据到来。但是,您的应用程序将无法加载,直到该请求完成。由于这个跳板应用程序 - 看门狗将终止您的应用程序。

    什么是看门狗

      

    看门狗 - 为了保持用户界面的响应,iOS   包括监督机制。如果您的应用程序无法响应   某些用户界面事件(启动,暂停,恢复,终止)   时间,看门狗将杀死你的应用程序并生成一个看门狗   超时崩溃报告。看门狗给你的时间不是   正式记录,但它总是少于网络超时。

    请在Apple网站上查看此Technical question

答案 1 :(得分:1)

为什么不检查[NSURLConnection sendSynchronousRequest:]是否有任何错误?

NSError *requestError = nil;
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&requestError];

if (requestError)
{
    NSLog(@"sync. request failed with error: %@", requestError);
}
else
{
    // handle data
}

你真的应该检查NSJSONSerialization是否也有错误:

NSError *jsonParsingError = nil;

NSDictionary *publicData =  [NSJSONSerialization JSONObjectWithData:response
                                                            options:0
                                                              error:&jsonParsingError];
if (jsonParsingError)
{
    NSLog(@"JSON parsing failed with error: %@", jsonParsingError);
}
else
{
    // do something
}