【问题标题】:Problems using NSXMLParser asynchronously异步使用 NSXMLParser 的问题
【发布时间】:2011-12-29 04:21:17
【问题描述】:

我一直在为 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。

任何帮助将不胜感激。

【问题讨论】:

    标签: ios xcode web-services ipad nsxmlparser


    【解决方案1】:

    如果你像这样在[xmlParser parse]; 之后调用[self onLoginButtonClicked]; 方法;

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

    我认为这对你有用。

    【讨论】:

    • 感谢您的回复。是的,这是可行的,但问题是 onLoginButtonClicked 是其他一些类的方法,而不是上述代码工作的类。
    • 那么你必须使用@protocol委托方法。你需要我帮忙吗?
    • 当然,如果可以的话,我会很感激的。
    猜你喜欢
    • 1970-01-01
    • 2014-07-26
    • 2012-01-05
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多