多个NSXMLParsers无法终止

时间:2012-08-28 16:12:51

标签: iphone objective-c ios xml nsxmlparser

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

要解释我的完整过程,请按照以下步骤

  1. 我使用多个NSURLConnections和NSURLRequests加载2个网页,在后台不阻止用户界面
  2. 然后我获取该数据并将其传递给xml解析器。
  3. 每个网页都有一个单独的XML解析器,每个网页都有自己的引用和分配给它的内存。
  4. 然后我像往常一样运行解析器,它查找我指示的特定标签,yadda yadda,这些东西都运行正常。
  5. 当我让解析器表明它们已经完成时,我会使用parserDidEndDocument:(NSXMLParser *)parser方法来检查文档是否已完成。不幸的是这个方法只调用一次,所以我不知道两个解析器是否都已完成。
  6. 我的代码是:

    连接完成后

    -(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方法只会因某种原因被调用一次。任何人看到任何错误或之前有过这个问题。感谢您提前提供任何帮助!

1 个答案:

答案 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);
        }
    }
}