ios - 异步使用 NSXMLParser 的问题

标签 ios xcode web-services ipad nsxmlparser

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

我正在从 Web 服务获取数据并将其提供给 NSXMLParser,就像这样

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

我正在实现解析器委托(delegate)方法 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。

如有任何帮助,我们将不胜感激。

最佳答案

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

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

我认为这对你有用。

关于ios - 异步使用 NSXMLParser 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8130994/

相关文章:

ios - NSURLSession 鉴权和后台下载文件

java - 发布 WebService 供公众访问

c# - 更新服务引用在 WCF 中不起作用

android - AWS MobileHub : Rename Android/iOS sample project

iphone - 如何在 iOS5 中使用 ALAssetsLibrary 访问照片而不请求位置访问?

iphone - 在 MFMessageComposeViewController 中点击取消后没有任何反应

ios - 如何在不修改每个 View Controller 文件的情况下支持 iOS 5 和 6 中的方向?

ios - 谷歌地图 sdks 集成未在 iOS9 中绘制 map

iphone - 我可以从 iOS 模拟器中访问 App Store 吗?

c# - Visual Studio SOAP 服务引用客户端 : see XML message