开发者

Is NSXMLParser's parse method asynchronous

开发者 https://www.devze.com 2022-12-31 19:06 出处:网络
Is NSXMLParser\'s parse method asynchronous? in other words if i have an NSXMLParse object and I call [someParseObject parse] from the main thread, will 开发者_如何学Goit block the main thread while

Is NSXMLParser's parse method asynchronous?

in other words if i have an NSXMLParse object and I call [someParseObject parse] from the main thread, will 开发者_如何学Goit block the main thread while it does its thing?


It is not asynchronous so it will block the main thread.


NSXMLParser can parse URL/Data, If we parse URL directly, it will freeze the UI(Main Thread),instead of that you can use Data Parsing by using NSXMLParser.Please go through NSURLConnection API for asynchronous fetching the data.


you can do like this NSXMLParser as asynchronous

dispatch_async( dispatch_get_global_queue(0, 0), ^{

    NSString * dovizUrl=@"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];
    });
});


Yes it blocks. Here is how i have used NSInvocationQueue to not block the UI thread when parsing... just call beginParsing with the url path as a string and it will take care of the rest:

-(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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号