好的,我在做一些NSXMLParsing时遇到了一些问题。解析器单独工作正常,但是当我尝试在后台异步运行它们时,只有其中一个表明它已经完成了解析文档。
要解释我的完整过程,请按照以下步骤
parserDidEndDocument:(NSXMLParser *)parser
方法来检查文档是否已完成。不幸的是这个方法只调用一次,所以我不知道两个解析器是否都已完成。 我的代码是:
连接完成后
-(void) connectionDidFinishLoading:(NSURLConnection *)connection {
if (connection == actConnection) {
[self processSynopsis]; // initiate synopsis parser
} else if (connection == castConnection) {
[self processCast]; // initiate cast parser
}
}
分配和启动概要解析器
-(void) processSynopsis {
actParser = [[NSXMLParser alloc] initWithData:actData];
[actParser setDelegate:self];
[actParser parse];
}
分配并启动强制解析器
-(void) processCast {
castParser = [[NSXMLParser alloc] initWithData:castData];
[castParser setDelegate:self];
[castParser parse];
}
检查解析器是否已终止
-(void) parserDidEndDocument:(NSXMLParser *)parser {
if (parser == actParser) {
NSLog(@"ended act %@",parser);
} else if (parser == castParser) {
NSLog(@"ended cast %@",parser);
}
}
parserDidEndDocument
方法只会因某种原因被调用一次。任何人看到任何错误或之前有过这个问题。感谢您提前提供任何帮助!
答案 0 :(得分:0)
NSLog是NSLogv的简单前端,它执行实际的日志记录工作。根据文件:
NSLogv的输出是序列化的,因为进程中只有一个线程可以一次执行上述写入/记录。在下一个线程开始尝试之前,所有写入/记录消息的尝试都已完成。
我不确定如何解释“可以开始”。这可能意味着在NSLogv运行时尝试记录某些内容将被忽略。因此,如果第二个解析器在第一个解析器之后很快完成,则不会发送日志消息。
尝试@synchronized()指令以防止两个线程相互踩踏。像这样:
-(void) parserDidEndDocument:(NSXMLParser *)parser {
@syncronized(self) {
if (parser == actParser) {
NSLog(@"ended act %@",parser);
} else if (parser == castParser) {
NSLog(@"ended cast %@",parser);
}
}
}