Как обрабатывать пустой 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);
}];

Вы, вероятно, хотите убедиться, что ваш объект ответа является словарем, прежде чем пытаться получить доступ к значениям ключа. Он может быть возвращен как массив, который будет аварийно завершать работу с чем-то вроде исключения, не закодированного по ключу-значению.

Другие вопросы по тегам