iphone objective-c cocoa concurrency nsxmlparser

iphone - ¿El método de análisis sintáctico de NSXMLParser es asincrónico?



objective-c cocoa (4)

¿El método de análisis sintáctico de NSXMLParser es asincrónico?

en otras palabras, si tengo un objeto NSXMLParse y llamo [someParseObject parse] desde el hilo principal, ¿bloqueará el hilo principal mientras lo hace?


No es asíncrono, por lo que bloqueará el hilo principal.


NSXMLParser puede analizar URL / Datos, si analizamos URL directamente, congelará la UI (Hilo Principal), en lugar de eso, usted puede usar el Análisis de Datos usando NSXMLParser. Vaya a NSURLConnection API para buscar asíncronamente los datos.


puedes hacer esto como NSXMLParser asincrónico

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


Sí bloquea. Así es como he usado NSInvocationQueue para no bloquear el subproceso de UI al analizar ... solo llame a beginParsing con la ruta url como una cadena y se encargará del resto:

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