0

好的,所以我在做一些 NSXMLParsing 时遇到了一些问题。解析器单独工作正常,但是当我尝试在后台异步运行它们时,只有其中一个会指示它已完成对文档的解析。

为了解释我的整个过程,它如下

  1. 我在后台使用多个 NSURLConnections 和 NSURLRequests 加载 2 个网页,以免阻塞用户界面
  2. 然后,我获取该数据并将其传递给 xml 解析器。
  3. 每个网页都有一个单独的 XML 解析器,每个都有自己的引用和分配给它的内存。
  4. 然后我像往常一样运行解析器,它会查找我指出的特定标签,yadda yadda,这些东西都工作正常。
  5. 当我让解析器指示它们已完成时,问题就出现了,我使用该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方法只会被调用一次。任何人都看到任何错误或以前遇到过这个问题。提前感谢您的帮助!

4

1 回答 1

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);
        }
    }
}
于 2012-08-28T21:18:22.557 回答