我正在使用以下内容使用NSJSONSerialization
请求数据。我遇到的问题是,如果数据无法访问(例如没有网络连接),应用程序崩溃。如果网络或服务器出现故障,我怎么能停止应用程序崩溃?
我在[self requestData];
方法
viewDidLoad:
-(void)requestData {
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
URLWithString:@"http://example.com/api/nodes"]];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSError *jsonParsingError = nil;
NSDictionary *publicData = [NSJSONSerialization JSONObjectWithData:response
options:0
error:&jsonParsingError];
publicDataArray = [publicData objectForKey:@"data"];
for(publicDataDict in publicDataArray) {
NSLog(@"data output is %@",[publicDataDict objectForKey:@"title"]);
}
}
感谢您的帮助
答案 0 :(得分:3)
一些想法:
问题在于:
您正使用synchronous
在viewDidLoad
中呼叫sendSynchronousRequest
个请求。但服务器已关闭,因此您无法获得结果,并且仍然期望任何数据到来。但是,您的应用程序将无法加载,直到该请求完成。由于这个跳板应用程序 - 看门狗将终止您的应用程序。
什么是看门狗?
看门狗 - 为了保持用户界面的响应,iOS 包括监督机制。如果您的应用程序无法响应 某些用户界面事件(启动,暂停,恢复,终止) 时间,看门狗将杀死你的应用程序并生成一个看门狗 超时崩溃报告。看门狗给你的时间不是 正式记录,但它总是少于网络超时。
请在Apple网站上查看此Technical question。
答案 1 :(得分:1)
为什么不检查[NSURLConnection sendSynchronousRequest:]
是否有任何错误?
NSError *requestError = nil;
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&requestError];
if (requestError)
{
NSLog(@"sync. request failed with error: %@", requestError);
}
else
{
// handle data
}
你真的应该检查NSJSONSerialization
是否也有错误:
NSError *jsonParsingError = nil;
NSDictionary *publicData = [NSJSONSerialization JSONObjectWithData:response
options:0
error:&jsonParsingError];
if (jsonParsingError)
{
NSLog(@"JSON parsing failed with error: %@", jsonParsingError);
}
else
{
// do something
}