Как обрабатывать пустой responseObject в AFHTTPRequestOperation
У меня проблема с обработкой пустого responseObject
в AFHTTPRequestOperation
во время запроса GET. Я использую библиотеку AFNetworking.
Если содержимое responseteObject имеет значение "0 объектов", мое приложение аварийно завершает работу, когда я пытаюсь получить доступ к ключам, которые недоступны в responseObject. Как я могу справиться с этим изящно? Вот как выглядит мой код:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:requestURL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(responseObject[@"NotAvailableKey"];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
Если содержимое responseObject не "0 объектов", код работает отлично. Даже если я пытаюсь получить доступ к ключу, которого нет в responseObject.
4 ответа
Ваш код падает, потому что responseObject
иногда в не NSDictionary. И поэтому он не реагирует на objectForKey:
, Вы должны проверить, что является классом responseObject:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:requestURL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
if ([responseObject isKindOfClass:[NSDictionary class]]
{
NSLog(responseObject[@"NotAvailableKey"]);
}
else
{
NSLog(@"Incorrect responseObject");
}
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
Используйте условное выражение с [responseObject count]
if ([responseObject count] == 0) {
//do nothing
return;
}
Вы можете попробовать следующее:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:requestURL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
if ([responseObject respondsToSelector:@selector:(objectForKey:)]) {
// Access the key you need to here.
NSLog(responseObject[@"NotAvailableKey"];
} else {
// responseObject is unexpected. Handle the error case here.
}
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
Вы, вероятно, хотите убедиться, что ваш объект ответа является словарем, прежде чем пытаться получить доступ к значениям ключа. Он может быть возвращен как массив, который будет аварийно завершать работу с чем-то вроде исключения, не закодированного по ключу-значению.