Проблемы с использованием NSXMLParser асинхронно - PullRequest
0 голосов
/ 15 ноября 2011

Я занимаюсь разработкой приложения для iPad и использую в нем веб-сервис.Все работает нормально, за исключением того, что NSXMLParser не работает асинхронно.

Я получаю данные из веб-службы и передаю их в NSXMLParser следующим образом

    xmlParser = [[NSXMLParser alloc] initWithData: webData];
   [xmlParser setDelegate: self];
   [xmlParser setShouldResolveExternalEntities:YES];
   [xmlParser parse];

Я реализую методы делегата синтаксического анализатора didStartElement,foundCharacters и didEndElement.Вот мой метод didEndElement

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"did end element");

    if ([elementName isEqualToString:@"authorizePassengerByEmailResult"])
    {
        NSLog(@"Inside Parser didEnd, CheckNo: %d",checkNo);

        NSLog(@"Soap Results: %@", soapResults);

        checkNo = 3;

        [soapResults setString:@""];
        elementFound = FALSE; 
    }
}

В приведенном выше методе checkNo - это глобальная переменная, которую я использую, чтобы проверить, меняется ли ее значение в didEndElement.

В моем viewController это какя вызываю вещи

- (BOOL)textFieldShouldReturn:(UITextField *)textField {

    if (textField == txtEmail)
    {
        [txtPwd becomeFirstResponder];
    }
    if (textField == txtPwd)
    {
        [textField resignFirstResponder];
        [self.activityIndicator startAnimating];

        [self startWebServiceOperations];

        [self onLoginButtonClicked];

    }
    return YES;
}

Вот два других метода

- (void)onLoginButtonClicked
{

    [self.activityIndicator stopAnimating];

    if ([results isEqualToString:@"Not Authorized"])
    {

    }
    else
    {
        NSLog(@"Should be 3 but Checkno:%d",checkNo);

    }

}

- (void)startWebServiceOperations
{
    NSLog(@"I m here, Hello");

    NSString *serviceURL = @"URLAddress";

    webServices = [[WebServices alloc] init];

    NSString *strEmail = [NSString stringWithFormat:@"%@",txtEmail.text];
    NSString *strPassword = [NSString stringWithFormat:@"%@",txtPwd.text];

    [webServices createRequest:serviceURL methodNameis:@"authorizePassengerByEmail" firstParameter:strEmail secondParameter:strPassword];
}

Теперь проблема в том, что я хочу завершить весь процесс веб-службы и методы NSXMLParser, а затем переместитьк следующей функции.Другими словами, я хочу, чтобы функция startWebServiceOperations полностью завершила работу, а затем перешла к функции onLoginButtonClicked.

Если я вижу глобальную переменную checkNo, она отображает вывод 1 вместо 3.

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 15 ноября 2011

если вы вызываете ваш [self onLoginButtonClicked]; метод после [xmlParser parse];, как это;

xmlParser = [[NSXMLParser alloc] initWithData: webData];
   [xmlParser setDelegate: self];
   [xmlParser setShouldResolveExternalEntities:YES];
   [xmlParser parse];
[self onLoginButtonClicked];

Я думаю, что это сработает для вас.

...