Является ли метод анализа NSXMLParser асинхронным?
Другими словами, если у меня есть объект NSXMLParse, и я вызываю [someParseObject parse]
из основного потока, он будет блокировать основной поток, пока он делает свою вещь?
Является ли метод анализа NSXMLParser асинхронным?
Другими словами, если у меня есть объект NSXMLParse, и я вызываю [someParseObject parse]
из основного потока, он будет блокировать основной поток, пока он делает свою вещь?
Он не является асинхронным, поэтому он блокирует основной поток.
NSXMLParser может анализировать URL/данные, если мы анализируем URL напрямую, он заморозит пользовательский интерфейс (главный поток), вместо этого вы можете использовать анализ данных с помощью NSXMLParser. Пожалуйста, перейдите по API NSURLConnection для асинхронного сбора данных.
Да, он блокирует. Вот как я использовал 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];
}
вы можете сделать этот NSXMLParser как асинхронный
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];
});
});