【问题标题】:NSJSONSerialization terminates app if no internet connection如果没有互联网连接,NSJSONSerialization 会终止应用程序
【发布时间】: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。
  • 没有网络时你的响应为零。

标签: ios nsjsonserialization nserror


【解决方案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>
    

    希望对你有帮助!!

    【讨论】:

    • 这也是一个很棒的不同解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2017-03-14
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多