Как обрабатывать пустой объект ответа в AFHTTPRequestOperation

У меня проблема с обработкой пустого responseObject в AFHTTPRequestOperation во время запроса GET. Я использую библиотеку AFNetworking.

Если содержимое responsteObject равно «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.


person andreaspfr    schedule 09.05.2014    source источник


Ответы (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);
    }];
person Avt    schedule 09.05.2014

Используйте условное выражение с [счетчик_ответов_объектов]

    if ([responseObject count] == 0) {
        //do nothing
        return;
    }
person Zia    schedule 09.05.2014

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

person Matt G    schedule 09.05.2014

Вы можете попробовать следующее:

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);
}];
person mithlesh jha    schedule 09.05.2014
comment
AFHTTPRequestOperationManager возвращает только NSDictionary и NSArray. Этот ответ не добавляет ничего полезного моему. - person Avt; 09.05.2014
comment
Можете ли вы сообщить мне ожидаемое тело ответа и ключ, к которому вы хотите получить доступ? - person mithlesh jha; 09.05.2014