Является ли метод синтаксического анализа NSXMLParser асинхронным - PullRequest
10 голосов
/ 19 мая 2010

Является ли метод синтаксического анализа NSXMLParser асинхронным?

Другими словами, если у меня есть объект NSXMLParse, и я вызываю [someParseObject parse] из основного потока, будет ли он блокировать основной поток, пока он делает свое дело?

Ответы [ 4 ]

18 голосов
/ 19 мая 2010

Он не асинхронный, поэтому он блокирует основной поток.

1 голос
/ 12 октября 2010

NSXMLParser может анализировать URL / данные. Если мы анализируем URL напрямую, он замораживает пользовательский интерфейс (основной поток), вместо этого вы можете использовать анализ данных с помощью NSXMLParser. Пожалуйста, пройдите через NSURLConnection API для асинхронной выборки данных. 1001 *

0 голосов
/ 14 декабря 2013

вы можете сделать это NSXMLParser как асинхронный

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];
    });
});
0 голосов
/ 01 декабря 2012

Да, это блокирует. Вот как я использовал NSInvocationQueue, чтобы не блокировать поток пользовательского интерфейса при разборе ... просто вызовите 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];
}
...