我想用解析后的 xml 结果创建对象,但它总是返回 null。我认为它在 nsxmlparser 委托(delegate)未完成之前完成。
这是我的代码。
@interface ParserOperation () <NSXMLParserDelegate, NSURLConnectionDelegate> {
NSString *soapResults;
NSXMLParser *xmlParser;
NSMutableData *responseData;
}
- (void)main {
NSError *error;
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self];
if (connection)
responseData = [NSMutableData data];
else
NSLog(@"NSURLConnection initWithRequest: Failed to return a connection.");
if ([self isCancelled]) {
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
self.callbackBlock(NO, error);
NSLog(@"error %@", error);
} else {
self.callbackBlock(YES, self.results);
NSLog(@"else %@", soapResults);
}
});
}
XML 解析器在 NSURLConnection 委托(delegate)方法完成时开始。
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"Completed, Received Bytes:%lu",(unsigned long)[responseData length]);
xmlParser = [[NSXMLParser alloc] initWithData: responseData];
xmlParser.delegate = self;
[xmlParser setShouldResolveExternalEntities:YES];
[xmlParser parse];
}
- (void)parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *)attributeDict {
soapResults = [[NSString alloc] init];
}
- (void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string {
soapResults = [soapResults stringByAppendingString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:self.resultName]) {
if ([soapResults isEqualToString:@""]) {
NSLog(@"error");
}
else {
NSData *jsonData = [soapResults dataUsingEncoding:NSUTF8StringEncoding];
NSError *e;
self.results = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&e];
NSLog(@"Parsed Object: %@", self.results);
NSLog(@"soap: %@", soapResults);
}
}
}
最佳答案
解析器是同步的,但下载不是。完成 block 的调用方法与开始下载的方法相同,因此它将始终在下载完成之前运行。
您应该仅在出现错误时调用该方法中的完成 block 。完成 block 应该在 [xmlParser parse];
之后调用,因为这是成功处理数据的时间。
关于ios - 我怎样才能等到 NSXMLParserDelegate 方法完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25102927/