gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:58:28 25 4
gpt4 key购买 nike

我每 5 秒使用计时器向我的服务器发送一次更新。作为响应,我从服务器收到一个 XML,我使用 NSXMLParser 解析它。 . MyParser 被设置为委托(delegate)并实现解析文档所需的回调(包括 - (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");
}
});
}

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

parseErrorOccurred 永远不会被调用。

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

有任何想法吗????

提前致谢

编辑:

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

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

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

谢谢

最佳答案

切换到在通信错误时明确提醒您的异步获取:NSURLSession如果低于 7 或更高,NSURLConnection 的适当类方法如果需要支持 6。无论哪种方式,您最终都会得到 NSError , 一个 NSDataNSURLResponse ,您可以将其转换为 NSHTTPURLResponse检查 200 响应代码。

如果没有错误、有效的响应代码和长度大于零的数据,则继续将数据交给 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 的改进功能的异步机制,例如取消,因为据说它在缓存方面要好得多,而且它会自动确保找到适当的位置来累积结果并最终异步调度完成处理程序。这样就节省了几行。

关于ios - 如何检查为什么 NSXMLParser initWithContentsOfURL 方法耗时太长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24801996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com