2011-11-15 3 views
0

Я разрабатываю приложение для iPad и потребляю в нем веб-службу. Все работает нормально, за исключением того, что NSXMLParser не работает асинхронно.Проблемы с использованием 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; 
} 

Вот два других mthods

- (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

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

ответ

2

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

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

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

+0

Спасибо за ответ. Да, это работает, но дело в onLoginButtonClicked - это метод другого класса, а не класс, в котором работает вышеприведенный код. – raziiq

+0

, тогда вы должны использовать метод делегирования '@ protocol'. вы хотите, чтобы я помог в этом? – relower

+0

Несомненно, если вы можете, я буду признателен. – raziiq

Смежные вопросы