ios - exception throw :'data parameter is nil',在 iOS 中访问 HTTP Web 服务时发生错误?
问题描述
我是 iPhone 应用程序开发的新手,在进行 API 调用时很少遇到以下错误。大多数时候我从服务器服务器得到正确的响应。但有时我面临以下错误。我已经检查了 URL 没有错误。在此先感谢。,任何人都可以分享您的知识以在没有此错误的情况下访问 API 调用。
这是我的代码
-(void)callUserAPI {
arrList = nil;
NSString *targetUrl;
// if ([[dict valueForKey:@"user_id"] isEqualToString:@"1"])
// targetUrl = [NSString stringWithFormat:@"%@index.php/restapi/chats?limit=%@",[dict valueForKey:@"support_location"],@"1000"];
// else
targetUrl = [NSString stringWithFormat:@“https://yoururl”,[dict valueForKey:@"support_location"],@"1000"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
NSString *authStr = [NSString stringWithFormat:@"%@:%@", [dict valueForKey:@"username"], [dict valueForKey:@"password"]];
NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64Encoding]];
[request addValue:authValue forHTTPHeaderField:@"Authorization"];
[request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
NSLog(@"%@",request.allHTTPHeaderFields);
[request setHTTPMethod:@"GET"];
[request setURL:[NSURL URLWithString:targetUrl]];
[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:
^(NSData * _Nullable data,
NSURLResponse * _Nullable response,
NSError * _Nullable error) {
NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
self->arrList = [[NSMutableArray alloc] init];
self->arrPending = [[NSMutableArray alloc] init];
self->arrActive = [[NSMutableArray alloc] init];
self->arrClosed = [[NSMutableArray alloc] init];
self->arrList =[responseDictionary valueForKey:@"list"];
// 0 - pending, 1 - active, 2 - closed chat,
for (NSDictionary *temp in self->arrList) {
if ([[temp valueForKey:@"status"] intValue] == 1 ) {
if (!([[self->dict valueForKey:@"user_id"] intValue] == 1) ) {
if ([[temp valueForKey:@"user_id"] intValue] == [[self->dict valueForKey:@"user_id"] intValue]) {
[self->arrActive addObject:temp];
}
}else{
[self->arrActive addObject:temp];
}
}
else if ([[temp valueForKey:@"status"] intValue] == 2 ) {
if (!([[self->dict valueForKey:@"user_id"] intValue] == 1) ) {
if ([[temp valueForKey:@"user_id"] intValue] == [[self->dict valueForKey:@"user_id"] intValue]) {
[self->arrClosed addObject:temp];
}
}else{
[self->arrClosed addObject:temp];
}
}else if ([[temp valueForKey:@"status"] intValue] == 0 ) {
[self->arrPending addObject:temp];
}
// if ([dict valueForKey:@"user_id"] == [temp valueForKey:@"user_id"]) {
// if ([[temp valueForKey:@"status"] intValue] == 0) {
// [self->arrPending addObject:temp];
// }else if([[temp valueForKey:@"status"] intValue] == 1) {
// [self->arrActive addObject:temp];
// }else if([[temp valueForKey:@"status"] intValue] == 2) {
// [self->arrClosed addObject:temp];
// }else{
//
// }
// }
}
dispatch_async(dispatch_get_main_queue(), ^{
self->_lblActiveCount.text = [NSString stringWithFormat:@"%lu",(unsigned long)self->arrActive.count];
self->_lblPendingCount.text = [NSString stringWithFormat:@"%lu",(unsigned long)self->arrPending.count];
self->_lblClosedCount.text = [NSString stringWithFormat:@"%lu",(unsigned long)self->arrClosed.count];
[self->_tblView reloadData];
[self->HUD hide:YES];
});
}] resume];
}
这就是每当我的应用程序从后台到前台时我得到的。
2019-06-19 16:53:56.366971+0530 LiveTracker[523:62321] TIC TCP 连接失败 [122:0x282b77540]: 1:53 Err(53) 2019-06-19 16:53:56.367912+0530 LiveTracker[523 :62321] 任务 .<122> HTTP 加载失败(错误代码:53 [1:53])2019-06-19 16:53:56.374704+0530 LiveTracker[523:62264] 任务 .<122> 完成错误 - 代码: 53 2019-06-19 16:53:56.378241+0530 LiveTracker[523:62305] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“数据参数为零”*First throw call stack: (0x1b76ac518 0x1b68879f8 0x1b75b6c70 0x1b8046390 0x100c7b65c 0x1b7c80688 0x1b7c94220 0x1b8110f68 0x1b801d420 0x1b801c908 0x1b8112cec 0x10141f6f0 0x101420c74 0x101423ffc 0x101423458 0x101431dc8 0x1014327ac 0x1b72cd1b4 0x1b72cfcd4) libc++abi.dylib: terminating with uncaught exception of type NSException
解决方案
该错误很可能由以下原因产生:
NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
这是因为有时 Web 请求会失败,原因可能是超时、连接错误,甚至只是 Web 会话过期。无论错误的原因是什么,在假设您有数据要解析之前,您都必须检查 API 请求是成功还是失败。
至少检查data
回调处理程序中是否为 nil。
推荐阅读
- sas - 查找主要日期
- ios - 使用 hitTest 方法的 tableview 部分 headview 中的问题
- python-3.x - 为什么 pandas.where() 返回“无”
- pyomo - 在 Pyomo 中使用男爵求解器
- entity-framework - 无法加载文件或程序集 System.Linq.Dynamic.Core 版本 = 1.0.15.0
- bash - 在while循环中设置的bash别名不持久
- julia - HTTP 服务器运行时如何重新加载代码?
- php - 如何通过等效字符串值在 Doctrine 中搜索布尔字段
- c# - MVC Web App - 当条码扫描仪连接为物理键盘时,如何允许用户使用虚拟键盘?
- javascript - 使用 withRouter 后,您不应在路由器外使用 Route