2010-05-19 50 views

回答

18

它不是異步的,所以它會阻塞主線程。

1

NSXMLParser可以解析URL/Data,如果我們直接解析URL,它將凍結UI(主線程),而不是通過使用NSXMLParser來使用數據解析。請通過NSURLConnection API來異步獲取數據。

0

是的,它阻止。下面是我用NSInvocationQueue解析時不會阻塞UI線程...只是調用beginParsing作爲一個字符串的URL路徑,並會照顧其餘的:

-(void) beginParsing:(NSString*) path{ 
    if(path ==nil) 
     return; 

    NSOperationQueue *queue = [[NSOperationQueue new] autorelease]; 

    NSInvocationOperation *operation= [[[NSInvocationOperation alloc] 
              initWithTarget: self 
                selector: @selector(createRequestToGetData:) 
                object: path] 
             autorelease]; 

    [queue addOperation:operation]; 
} 

-(void)createRequestToGetData:(NSString*)path 
{ 
    NSURL* Url = [NSURL URLWithString:path]; 

    NSXMLParser* parser = [[NSXMLParser alloc] initWithContentsOfURL:Url]; 

    [parser setDelegate:self]; 

    NSLog(@"path is %@",path); 
    [parser parse]; 

    [path release]; 
    [parser release]; 
} 
+0

爲什麼要釋放路徑參數? – jcpennypincher 2015-04-16 19:02:21

0

你可以做這樣的NSXMLParser as asynchronous

dispatch_async(dispatch_get_global_queue(0, 0), ^{ 

    NSString * [email protected]"http://www.tcmb.gov.tr/kurlar/today.xml"; 
    NSURL *url = [NSURL URLWithString:dovizUrl]; 
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
    xmlParser.delegate = self; 
    // call the result handler block on the main queue (i.e. main thread) 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // running synchronously on the main thread now -- call the handler 
     [xmlParser parse]; 
    }); 
}); 
+2

[xmlParser parse]在主線程上運行並將阻塞它。 您只能初始化異步方法。 – 2014-06-16 07:47:00

+0

@PhilipKramarov說什麼。 – nmdias 2016-05-12 07:49:16