如何在断开Internet连接时处理NSJSONSerialization崩溃

时间:2013-08-06 00:17:19

标签: iphone ios json web-services nsjsonserialization

我在我的应用中实现了网络服务。我的方式很典型。

- (BOOL)application:(UIApplication *)application     didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Web Service  xxx,yyy are not true data
    NSString *urlString =   @"http://xxx.byethost17.com/yyy";
    NSURL *url = [NSURL URLWithString:urlString];
    dispatch_async(kBackGroudQueue, ^{
        NSData* data = [NSData dataWithContentsOfURL: url];
        [self performSelectorOnMainThread:@selector(receiveLatest:)     withObject:data waitUntilDone:YES];
    });   
    return YES;
}

- (void)receiveLatest:(NSData *)responseData {
    //parse out the json data
    NSError* error;
    NSDictionary* json = [NSJSONSerialization
                      JSONObjectWithData:responseData
                      options:kNilOptions
                      error:&error];
    NSString *Draw_539 = [json objectForKey:@"Draw_539"];
....

控制台错误消息:

  

* 由于未捕获的异常而终止应用   'NSInvalidArgumentException',原因:'data parameter is nil'

当我的iphone连接到互联网时,该应用程序成功运行。但如果它断开连接到互联网,应用程序将在NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];上崩溃 你能告诉我如何处理这个错误吗? NSError有用吗?

2 个答案:

答案 0 :(得分:11)

错误告诉您“responseData”为零。避免异常的方法是测试“responseData”,如果它是nil则不调用JSONObjectWithData。相反,你会觉得你应该为这个错误条件做出反应。

答案 1 :(得分:9)

在将responseData传递给JSONObjectWithData:options:error:方法之前,您不会检查- (void)receiveLatest:(NSData *)responseData { //parse out the json data NSError* error; if(responseData != nil) { NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; NSString *Draw_539 = [json objectForKey:@"Draw_539"]; } else { //Handle error or alert user here } .... } 是否为零。

可能你应该试试这个:

error

EDIT-1:为了更好的做法,您应该在JSONObjectWithData:options:error:方法之后检查此- (void)receiveLatest:(NSData *)responseData { //parse out the json data NSError* error; if(responseData != nil) { NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; if(!error) { NSString *Draw_539 = [json objectForKey:@"Draw_539"]; } else { NSLog(@"Error: %@", [error localizedDescription]); //Do additional data manipulation or handling work here. } } else { //Handle error or alert user here } .... } 对象,以查看JSON数据是否已成功转换为NSDictionary < / p>

{{1}}

希望这能解决您的问题。

如果您需要更多帮助,请与我联系。