AFNetworking — AFHTTPRequestOperation в цикле for (перечисление массива)?

Я использую AFNetworking (AFHTTPRequestOperation), чтобы совершать звонки в сеть и возвращать данные. Мне нужно использовать код в цикле for (перечисление карт), чтобы проверить каждую карту и получить данные обратно, если операция прошла успешно, я получаю информацию о картах, и если это не удается, я должен получить оповещение (с использованием представления оповещения). Проблема в том, что я получаю несколько предупреждений, если это не удается (потому что это внутри цикла for и может быть несколько карт). Как я могу просто показывать одно предупреждение только тогда, когда ему не удается подключиться к сети?

Я знаю, что операция асинхронная, но не могу заставить ее работать.

Код ниже: -

- (void)verifyMobileDeviceStatus
{
  [self fetchRequest];

  [self.contentsArray enumerateObjectsUsingBlock:^(GCards *gCard, NSUInteger idx, BOOL * stop) {

    NSURL *baseURL = nil;

    baseURL = [NSURL URLWithString:BASE_URL_STRING];

    NSString *soapBody = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?><soapenv:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header/><soapenv:Body><VerifyMobileDeviceStatus xmlns=\"http://tempuri.org/\"><Request><AuthToken>%@</AuthToken></Request></VerifyMobileDeviceStatus></soapenv:Body></soapenv:Envelope>", [gCard valueForKey:@"authToken"]];

    NSLog(@" auth token =%@", [gCard valueForKey:@"authToken"]);

    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:baseURL];
    NSString *msgLength = [NSString stringWithFormat:@"%d", [soapBody length]];

    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[soapBody dataUsingEncoding:NSUTF8StringEncoding]];
    [request addValue: msgLength forHTTPHeaderField:@"Content-Length"];
    [request addValue:@"http://tempuri.org/VerifyMobileDeviceStatus" forHTTPHeaderField:@"SOAPAction"];
    [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

        NSLog(@"success: %@", operation.responseString);

        NSString *xmlString = [operation responseString];

        [parser setGCard:gCard];

        [parser parseXML:xmlString];

        if([gCard.merchantStatus isEqualToString:MERCHANT_STATUS_ACTIVE])
        {
            gCard.isPremiumAccount = [NSNumber numberWithInt:1];
        }
        else
        {
            gCard.isPremiumAccount = [NSNumber numberWithInt:0];
        }

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        [parser.delegate verifyDeviceStatusParserDidFailWithError:@"Error"];

        NSLog(@"error: %@", [error userInfo]);

    }];

        [operation start];
 }];
}

- (void)verifyDeviceStatusParserDidFailWithError:(NSString *)error
{
   NSString *errorString = [NSString stringWithFormat:@"Error =%@", [error description]];
   NSLog(@"Error parsing XML: %@", errorString);

   BlockAlertView* alert = [BlockAlertView alertWithTitle:@"Connection Failed" message:@"Connection to web service Failed. Please try again."];

   [alert addButtonWithTitle:NSLocalizedString(@"OK", nil) block:^{ }];

   [alert show];

   [activityIndicator stopAnimating];

   self.navigationController.view.userInteractionEnabled = YES;
 }

Он показывает предупреждение несколько раз, если оно не работает, и мне нужно показать его только один раз.

Любая помощь будет оценена по достоинству.


person Angad Manchanda    schedule 03.08.2013    source источник


Ответы (1)


Вам нужно сделать представление предупреждений свойством класса, поэтому.

1 - Объявите свойство (предупреждение) типа BlockAlertView в классе, который делает несколько запросов (назовем его RequesterClass). Это свойство будет ссылаться на уникальное представление предупреждений, которое будет отображаться только один раз.

2 - Поместите эти 2 строки в метод инициализации RequesterClass

_alert = [BlockAlertView alertWithTitle:@"Connection Failed" message:@"Connection to web service Failed. Please try again."];
[_alert addButtonWithTitle:NSLocalizedString(@"OK", nil) block:^{ }];

3 - Измените verifyDeviceStatusParserDidFailWithError: следующим образом:

- (void)verifyDeviceStatusParserDidFailWithError:(NSString *)error
{
    NSString *errorString = [NSString stringWithFormat:@"Error =%@", [error description]];
    NSLog(@"Error parsing XML: %@", errorString);

    if(!alert.visible)
    {
        [alert show];
    }

    [activityIndicator stopAnimating];

    self.navigationController.view.userInteractionEnabled = YES;
}

Надеюсь, поможет!

person lucaslt89    schedule 03.08.2013
comment
нет, это не связано с предупреждением о блокировке. Речь идет о том, как использовать этот сетевой вызов в цикле for, чтобы избежать множественных предупреждений. - person Angad Manchanda; 05.08.2013
comment
Я заставил это работать, используя iVar (BOOL showAlert) и в приведенном выше методе, проверяя, является ли оно ложным, инициализируя представление предупреждения и показывая предупреждение и делая этот iVar ИСТИННЫМ. Это сработало. - person Angad Manchanda; 05.08.2013
comment
это тот же подход, но вместо использования свойства visible UIAlertView вы используете свой собственный iVar - person lucaslt89; 06.08.2013
comment
Хорошо. Я не могу использовать свойство visible со своим собственным оповещением. Я принял твой ответ. Спасибо! - person Angad Manchanda; 06.08.2013