我一直在为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。
任何帮助都将受到高度赞赏。
答案 0 :(得分:2)
如果您在[self onLoginButtonClicked];
之后调用[xmlParser parse];
方法,那么
xmlParser = [[NSXMLParser alloc] initWithData: webData];
[xmlParser setDelegate: self];
[xmlParser setShouldResolveExternalEntities:YES];
[xmlParser parse];
[self onLoginButtonClicked];
我认为这对你有用。