如何检查为什么NSXMLParser initWithContentsOfURL方法耗时太长?

时间:2014-07-17 11:12:41

标签: ios

我使用计时器每隔5秒向服务器发送一次更新。作为响应,我从服务器收到一个XML,我使用NSXMLParser解析。 MyParser被设置为委托并实现所需的回调来解析文档(包括- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError)。 大多数情况下解析成功但每隔几分钟initWithContentsOfURL卡住大约一分钟(几乎每分钟一分钟),然后[parser parse]返回false,然后我继续成功解析直到下一次失败。

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5
                                                  target:self
                                                selector:@selector(parseDocument)
                                                userInfo:nil
                                                 repeats:YES];

- (void) parseDocument {
    dispatch_async(queue, ^{

        NSLog(@"before NSXMLParser alloc");
        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[[NSURL alloc] initWithString:@"https://secure.xxxxxxxxxxxxxxxxxxxxxx.dbm?xxxxxxxxxxxxxxxxxxxx"]];
        NSLog(@"after NSXMLParser alloc");

        MyParser *myParser = [[MyParser alloc] initParser:4];
        [parser setDelegate:myParser];
        BOOL result = [parser parse];
        if (result) {
            NSLog(@"Successful parse");
        } else {
            NSLog(@"Failed parse");
        }
    });
}

我的问题是如何检查为什么解析(失败)花了大约一分钟而不是返回false?

永远不会调用parseErrorOccurred。

我检查了服务器端,一切正常,正常运行。

任何想法????

提前致谢

编辑:

事实证明,[parser parse]工作正常,问题出现在initWithContentsOfURL中,每隔几分钟,此行需要一分钟(而不是1-2秒),而不是解析返回false。 / p>

我检查了服务器端,如果在那一分钟内一切正常,看起来很好。 还检查了解析器是不是nil,它不是。

有关如何在此行中每隔几分钟检查一次导致问题的任何建议:NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[[NSURL alloc] initWithString:@"https://secure.xxxxxxx.dbm?xxxxxxxxxx"]];,将非常感谢。

由于

1 个答案:

答案 0 :(得分:3)

切换到异步提取,在发生通信错误时显式提醒您:NSURLSession如果低于7或更高,则NSURLConnection的相应类方法(如果需要支持6)。无论哪种方式,您最终都会得到NSErrorNSDataNSURLResponse,您可以将其转换为NSHTTPURLResponse以检查200响应代码。< / p>

如果没有错误,有效的响应代码和长度大于零的数据,请继续将数据传递给NSXMLParser

编辑:所以,我现在在一台真正的计算机上(而不是iPad),因此可以补充一点,我倾向于使用以下代码:

[[[NSURLSession sharedSession]
    dataTaskWithURL:[NSURL URLWithString:@"https://secure.xxxxxxxxxxxxxxxxxxxxxx.dbm?xxxxxxxxxxxxxxxxxxxx"]
    completionHandler:
    ^(NSData *data, NSURLResponse *response, NSError *error)
    {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;

        if(httpResponse.statusCode != 200 || error || ![data length])
        {
            NSLog(@"Some error condition");
            return;
        }

        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
        [parser setDelegate:myParser];
        BOOL result = [parser parse];
        if (result) {
            NSLog(@"Successful parse");
        } else {
            NSLog(@"Failed parse");
        }
    }] resume];

我赞成NSURLSession,即使我刚刚将返回的任务告诉resume并且从未使用任何改进的功能NSURLConnection&#39 ; s异步机制,例如取消,因为它在缓存方面有更好的表现,并且因为它会自动确保找到合适的位置来累积结果并最终异步地调度完成处理程序。这样就省去了几行。