异步使用NSXMLParser的问题

时间:2011-11-15 03:06:59

标签: ios xcode web-services ipad nsxmlparser

我一直在为iPad开发一款应用程序,并在其中使用Web服务。除了NSXMLParser没有异步工作外,一切正常。

我从Web服务获取数据并将其提供给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];
}

现在问题是我想完成整个Web服务进程和NSXMLParser方法,然后转到下一个函数。换句话说,我希望startWebServiceOperations函数完全完成,然后移动到onLoginButtonClicked函数。

如果我看到全局变量checkNo它显示输出1而不是3。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

如果您在[self onLoginButtonClicked];之后调用[xmlParser parse];方法,那么

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

我认为这对你有用。