0

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

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

3 回答 3

2

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

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

于 2013-08-19T12:35:41.377 回答
1

把条件像这样

if(response!=nil) {

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

    jsonArray1 = [[NSMutableArray alloc] init];

    for(int i=0;i<[jsonArray count];i++)
    {
       ...
       ..
       .
    }
}
于 2013-08-19T12:36:46.790 回答
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>

希望能帮助到你!!

于 2013-08-19T12:41:44.767 回答