如果没有互联网连接,NSJSONSerialization 会终止应用程序

Posted

技术标签:

【中文标题】如果没有互联网连接,NSJSONSerialization 会终止应用程序【英文标题】:NSJSONSerialization terminates app if no internet connection 【发布时间】:2013-08-19 12:31:56 【问题描述】:

当我运行我的应用时,如果没有互联网连接,它会直接终止我的应用并显示此消息。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil

- (void)viewDidLoad

response = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://example.com/jsonTest.php"]];

NSError *parseError = nil;

jsonArray = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingAllowFragments error:&parseError];

jsonArray1 = [[NSMutableArray alloc] init];

for(int i=0;i<[jsonArray count];i++)

   ...
   ..
   .



我已尝试使用下面的代码来显示警报视图,但没有显示任何内容,我做错了什么吗?

-(void)uploadRequestFailed:(NSJSONSerialization *)request

    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"No internet connection" message:@"Please check the internet connection" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];

【问题讨论】:

我认为您的应用程序终止了,因为您在没有网络连接的情况下将nil 数据传递给NSJSONSerialization 没有网络时你的响应为零。 【参考方案1】:

如果您没有互联网连接,您的响应对象将为 nil。这样,您的 NSJSONSerialization 调用将引发异常,因为第一个参数为 nil。

在假设您可以用它实例化 JSON 之前,您应该检查 response 是否为 nil。

【讨论】:

【参考方案2】:

这样写条件

if(response!=nil) 

    jsonArray = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingAllowFragments error:&parseError];

    jsonArray1 = [[NSMutableArray alloc] init];

    for(int i=0;i<[jsonArray count];i++)
    
       ...
       ..
       .
    

【讨论】:

仍然应该考虑使用if 语句来测试jsonArray 是否为零,因为可能无法解析响应。【参考方案3】:

这是因为您正在进行网络通话并从服务器获取数据

response = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://example.com/jsonTest.php"]];

但没有活动连接,因此您将在响应变量中一无所获。并且当您将该响应传递给 jsonarray 时无法解析它。所以发生了错误。我建议在进行网络通话之前检查互联网连接。如果有活动连接,那么只有您可以调用服务器。您可以像这样检查互联网连接:

- (BOOL) connectedToNetwork

    // Create zero addy
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;

    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);

    if (!didRetrieveFlags)
    
        return NO;
    

    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
    return (isReachable && !needsConnection) ? YES : NO;

为使此代码工作添加库:

SystemConfiguration.framework

并将其导入您的班级

#import <SystemConfiguration/SystemConfiguration.h>

希望对你有帮助!!

【讨论】:

这也是一个很棒的不同解决方案。

以上是关于如果没有互联网连接,NSJSONSerialization 会终止应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如果没有互联网连接,NSJSONSerialization 会终止应用程序

如果没有互联网连接,如何在一段时间后重试连接不和谐机器人?

(颤振)如果没有互联网连接,如何启动静态 html 页面而不是 URL?

如何检测互联网连接[重复]

如果没有可用的互联网,如何将 ContentView 设置为另一个片段,如果连接可用,如何恢复片段

如何阻止用户,如果他/她在我的应用程序加载时没有连接到互联网连接