Я занимаюсь разработкой приложения для 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.
Любая помощь будет принята с благодарностью.