2013-04-23 57 views
0

我是新來的多線程,想知道我怎麼可以在後臺運行這個功能?該函數只是返回一個用於XML解析並從另一個函數調用的NSURL。或者它是否值得在後臺運行,因爲調用它的函數不會繼續,直到此函數返回其NSURL。基本上,我只是想弄清楚如何加快速度,因爲它需要一點時間才能完成!iOS執行功能在後臺

+ (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; 
} 

回答

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]); 
    }]; 
+0

真棒感謝。我已經使用AFNetworking進行解析操作。此代碼塊僅返回用於爲AFNetwokring XML操作創建鏈接的URL。 – 2013-04-23 16:17:57

+0

你也可以通過AFNetworking獲取數據,避免(不是真棒)'[[NSData alloc] initWithContentsOfURL:theURL];'請致電 – 2013-04-23 16:19:00

+0

我在完成時使用了未聲明的標識符'url'。 – 2013-04-23 16:20:45