我是多线程新手,想知道如何在后台运行此功能?该函数只返回一个用于XML解析的NSURL,并从另一个函数调用。或者它甚至值得在后台运行,因为调用它的函数在此函数返回其NSURL之前不会继续。基本上,我只想弄清楚如何加快速度,因为它需要一点时间才能完成!
+ (NSURL *)parserURL {
NSURL *theURL = [NSURL URLWithString:@"http://www.wccca.com/PITS/"];
NSData *data = [[NSData alloc] initWithContentsOfURL:theURL];
TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:data];
NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"];
if (elements.count >= 1) {
TFHppleElement *element = [elements objectAtIndex:0];
TFHppleElement *child = [element.children objectAtIndex:0];
NSString *idValue = [child content];
NSString *stg = [NSString stringWithFormat:@"http://www.wccca.com/PITS/xml/fire_data_%@.xml", idValue];
NSURL *url = [NSURL URLWithString:stg];
return url;
}
return nil;
}
答案 0 :(得分:1)
您的代码的主要问题是您正在使用阻止操作从网站获取数据。你肯定想在后台线程中执行它。但是,我建议您查看可以帮助您轻松完成这些操作的网络框架,例如AFNetworking,
在任何情况下,我将遵循多线程操作或类似操作的策略如下: 它分解为用GDC调度它,然后在主线程中用结果执行接收完成块。
以下是代码:
描述的
首先声明你的函数接收一个块。一旦完成检索和解析数据,该块将在最后执行。接下来,代码要求GDC在后台队列中执行代码块。完成后,我们要求代码执行作为主线程中函数的参数提供的完成块,并将解析后的字符串提供给它。
+(void) parserURL:(NSURL *) theURL completion:(void (^) (NSURL *finalURL))completionBlock{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [[NSData alloc] initWithContentsOfURL:theURL];
TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:data];
NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"];
NSURL *url;
if (elements.count >= 1) {
TFHppleElement *element = [elements objectAtIndex:0];
TFHppleElement *child = [element.children objectAtIndex:0];
NSString *idValue = [child content];
NSString *stg = [NSString stringWithFormat:@"http://www.wccca.com/PITS/xml/fire_data_%@.xml", idValue];
url = [NSURL URLWithString:stg];
}else{
url = nil;
}
dispatch_async(dispatch_get_main_queue(), ^{
completionBlock(url);
});
});
}
您可以通过以下方式调用该方法:
[URLParser parserURL:[NSURL URLWithString:@"http://www.wccca.com/PITS/"] completion:^(NSURL *finalURL) {
NSLog(@"Parsed string %@", [finalURL absoluteString]);
}];