0

我是多线程新手,想知道如何在后台运行这个函数?该函数只返回一个用于 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;
}
4

1 回答 1

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]);
    }];
于 2013-04-23T16:14:56.040 回答