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

时间:2013-08-19 12:31:57

标签: ios nsjsonserialization nserror

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

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];
}

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

像这样的条件

if(response!=nil) {

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

    jsonArray1 = [[NSMutableArray alloc] init];

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

答案 2 :(得分:1)

这是因为你正在做网络摄像头并从服务器获取数据

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>

希望它能帮助!!