如果没有互联网连接,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?